Cod sursa(job #1141424)

Utilizator marta_diannaFII Filimon Marta Diana marta_dianna Data 12 martie 2014 21:13:11
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<fstream>
#include<vector>
#define MOD 666013
#define NMAX 1048600

using namespace std;

ifstream f("secv5.in");
ofstream g("secv5.out");

struct pereche
{
    int nou, vechi;
};
int n, st, dr, rez, a[NMAX], frst[NMAX], frdr[NMAX];
long long sol;
vector<pereche> H[MOD];

int gaseste(int x)
{
    int y=x%MOD, lim, i;
    lim=H[y].size();
    for (i=0; i<lim; ++i)
        if (x==H[y][i].vechi)
            return H[y][i].nou;
    return 0;
}

void Adauga(int vechi, int nou)
{
    pereche aux;
    aux.vechi=vechi; aux.nou=nou;
    H[vechi%MOD].push_back(aux);
}

void Citeste()
{
    int i, x, nr=0, pz;
    f>>n>>st>>dr;
    for (i=1; i<=n; ++i)
    {
        f>>x;
        pz=gaseste(x);
        if (!pz)
        {
            ++nr; a[i]=nr;
            Adauga(x, nr);
        }
        else a[i]=pz;
    }
}

void Solve(int x, int fr[], int stare)
{
    int i, nr=0, p=1;

    for (i=1; i<=n; ++i)
    {
        if (fr[a[i]]==1) fr[a[i]]++;
        else
        {
            fr[a[i]]=1;
            if (nr<=x) ++nr;
            while (nr>x && a[p]==a[p+1]) ++p;
            if (nr>x) ++p;
            if (nr>x) --nr;
        }
        sol+=stare*(i-p+1);
    }
}

void Scrie()
{
    g<<sol<<"\n";
}

int main()
{
    Citeste();

    Solve(dr, frdr, 1);

    Solve(st-1, frst, -1);

    Scrie();

    f.close();
    g.close();
    return 0;
}