Cod sursa(job #1174104)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 21 aprilie 2014 23:56:03
Problema Secventa 5 Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.3 kb
#include <fstream>
#include <vector>
#define mod 666013
#define total (1<<20)+5

using namespace std;

struct norme
{
    unsigned int r,y;
} v[total];
long long n,l,u,i,k,j,tot=1;
int p[total];
vector <norme> x[mod];
vector <norme>::iterator it;
inline void adauga(norme rachi)
{
    x[rachi.r%mod].push_back(rachi);
}
inline unsigned int cauta(unsigned int k)
{
    int zum=k%mod;
    for(it=x[zum].begin();it!=x[zum].end();it++)
    {
        if(it->r==k) return it->y;
    }
    return 0;
}
inline long long secv(int x)
{
    int nr=1,last=0;
    long long sol=1;
    p[v[0].y]=1;
    for(i=1;i<n;i++)
    {
        if(p[v[i].y]==0) nr++,p[v[i].y]=1;
        else p[v[i].y]++;
        if(nr>x)
        {

            while(nr!=x)
            {
                p[v[last].y]--;
                if(p[v[last].y]==0) nr--;
                last++;

            }
        }
        sol=sol+i-last+1;
    }
    for(i=0;i<n;i++) p[v[i].y]=0;
    return sol;
}
ifstream fin("secv5.in");
ofstream fout("secv5.out");
int main()
{

        fin>>n>>l>>u;
        for(i=0;i<n;i++)
        {
            fin>>k;
            v[i].r=k;
            v[i].y=cauta(k);
            if(v[i].y==0) v[i].y=tot,tot++;
            adauga(v[i]);
        }
        fout<<secv(u)-secv(l-1);
}