Cod sursa(job #1174112)

Utilizator alevasluialeHuhurez Marius alevasluiale Data 22 aprilie 2014 00:17:19
Problema Secventa 5 Scor 40
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.5 kb
#include <cstdio>
#include <vector>
#define mod 666013
#define total (1<<20)+5
using namespace std;
struct norme
{
    unsigned int r,y;
} v[total];
int n,l,u,i,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 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;
    if(x==0) return 0;
    return sol;
}
char buffer[total*15];
int j;
int main()
{
        freopen("secv5.in","r",stdin);
        freopen("secv5.out","w",stdout);
        scanf("%d %d %d\n",&n,&l,&u);
        fread(buffer,15,total*15,stdin);
        for(i=0;i<n;i++)
        {   v[i].r=0;
            while(buffer[j]!='\n'&&buffer[j]!=0) {v[i].r=v[i].r*10+buffer[j]-'0';j++;}
            v[i].y=cauta(v[i].r);
            j++;
            if(v[i].y==0) v[i].y=tot,tot++;
            adauga(v[i]);
        }
        printf("%lld",secv(u)-secv(l-1));
}