Cod sursa(job #88896)
#include<stdio.h>
struct nod{
unsigned long int vi;
unsigned long int vf;
nod *next;
};
unsigned long int N,L,U,i,x[1050050],a,b,c,cc,bb,f1[1050050],f2[1050050],y,li,vn;
long long int sol;
nod *p[3000000],*u[3000000];
void norm(unsigned long int vv);
int main()
{
FILE *f,*g;f=fopen("secv5.in","r");g=fopen("secv5.out","w");
fscanf(f,"%lu%lu%lu",&N,&L,&U);
for(i=1;i<=N;i++)
{ fscanf(f,"%lu",&y);norm(y);}
while(bb<L&&b<=N)
{ b++;
if(b==N+1) { fprintf(g,"%lld\n",sol);fcloseall();return 0;}
f1[x[b]]++;if(f1[x[b]]==1)bb++;
f2[x[b]]=f1[x[b]];
}
c=b;cc=bb;
while(cc<=U&&c<=N)
{ c++;
if(c==N+1) cc=U+1;
else { f2[x[c]]++;if(f2[x[c]]==1)cc++;}
}
for(;;)
{
sol+=(long long int)(c-b);
a++;
f1[x[a]]--;
if(f1[x[a]]==0) bb--;
f2[x[a]]--;
if(f2[x[a]]==0) cc--;
while(bb<L&&b<=N)
{ b++;
if(b==N+1) { fprintf(g,"%lld\n",sol);fcloseall();return 0;}
f1[x[b]]++;if(f1[x[b]]==1)bb++;
}
while(cc<=U&&c<=N)
{ c++;
if(c==N+1) cc=U+1;
else { f2[x[c]]++;if(f2[x[c]]==1)cc++;}
}
}
}
void norm(unsigned long int vv)
{ nod *nou,*q;
vn=vv%2999997;
if(!p[vn])
{ li++;x[i]=li;
nou=new nod;nou->vi=vv;nou->vf=li;nou->next=0;p[vn]=nou;u[vn]=nou;
return;
}
q=p[vn];
while(q){if(q->vi==vv){x[i]=q->vf;return;}q=q->next;}
li++;x[i]=li;
nou=new nod;nou->vi=vv;nou->vf=li;nou->next=0;u[vn]->next=nou; u[vn]=nou;
}