Pagini recente » Cod sursa (job #2097661) | Cod sursa (job #1553613) | Cod sursa (job #650051) | Cod sursa (job #573760) | Cod sursa (job #1332022)
#include <stdio.h>
#define HASH 2093570
#define MAXN 1048576
unsigned int val[2*MAXN+1], v[MAXN+1];
int hash1[HASH], hash2[HASH], next[2*MAXN+1], fr[2*MAXN+1], m;
inline int exista(unsigned int x, int lista[]){
int p=lista[x%HASH], f=0;
while((p!=0)&&(f==0)){
if(val[p]==x){
f=fr[p];
}
p=next[p];
}
return f;
}
inline void adauga(unsigned int x, int lista[]){
int p=lista[x%HASH], f=0;
while((p!=0)&&(f==0)){
if(val[p]==x){
f=p;
}
p=next[p];
}
if(f!=0){
fr[f]++;
}else{
val[++m]=x;
fr[m]=1;
next[m]=lista[x%HASH];
lista[x%HASH]=m;
}
}
inline void scoate(unsigned int x, int lista[], int *e){
int p=lista[x%HASH], f=0;
if(val[p]==x){
fr[p]--;
if(fr[p]==0){
(*e)--;
}
}else{
while((next[p]!=0)&&(f==0)){
if(val[next[p]]==x){
f=p;
}
p=next[p];
}
fr[next[f]]--;
if(fr[next[f]]==0){
(*e)--;
}
}
}
int main(){
int n, l, u, a, b, p, q, i;
long long ans;
FILE *fin, *fout;
fin=fopen("secv5.in", "r");
fout=fopen("secv5.out", "w");
fscanf(fin, "%d%d%d", &n, &l, &u);
for(i=1; i<=n; i++){
fscanf(fin, "%u", &v[i]);
}
a=b=p=q=ans=0;
for(i=1; i<=n; i++){
while((a<l)&&(p<n)){
p++;
if(exista(v[p], hash1)==0){
a++;
}
adauga(v[p], hash1);
}
while((q<n)&&((b<u)||((b==u)&&(exista(v[q+1], hash2)!=0)))){
q++;
if(exista(v[q], hash2)==0){
b++;
}
adauga(v[q], hash2);
}
if(a==l){
ans+=q-p+1;
}
scoate(v[i], hash1, &a);
scoate(v[i], hash2, &b);
}
fprintf(fout, "%lld\n", ans);
fclose(fin);
fclose(fout);
return 0;
}