Pagini recente » Statistici sarateanu armand (heeiyyoo) | Cod sursa (job #166514) | Cod sursa (job #1040087) | Cod sursa (job #1274150) | Cod sursa (job #1762718)
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#define MOD 666013
#define MAXN 1048576
#define BUF_SIZE 16384
char buf[BUF_SIZE];
int pbuf=BUF_SIZE;
FILE*fi,*fo;
inline char nextch(){
if(pbuf==BUF_SIZE){
fread(buf, BUF_SIZE, 1, fi);
pbuf=0;
}
return buf[pbuf++];
}
inline long long nextnum(){
long long a=0;
char c=nextch();
while((c<'0' || c>'9') && c!='-')
c=nextch();
int semn=1;
if(c=='-'){
semn=-1;
c=nextch();
}
while('0'<=c && c<='9'){
a=a*10+c-'0';
c=nextch();
}
return a*semn;
}
class Hash{
public:
long long k=0, next[MAXN+1], *lista;
long long val[MAXN+1];
long long d[MAXN+1];
Hash() {
lista = new int[MOD];
memset(lista, 0x00, MOD*sizeof(int));
}
inline void insert(long long element, long long frecventa){
k++;
val[k]=element;
d[k]=frecventa;
next[k]=lista[element%MOD];
lista[element%MOD]=k;
}
inline void erase(long long element){
long long p=lista[element%MOD];
if(p==0)
return ;
if(val[p]==element){
d[p]--;
if(!d[p])
lista[element%MOD]=next[lista[element%MOD]];
return ;
}
while((next[p]!=0)&&(val[next[p]]!=element))
p=next[p];
if(next[p]!=0){
d[p]--;
if(!d[p])
next[p]=next[next[p]];
}
}
inline long long find(long long element){
long long p=lista[(1LL*element+1LL*MOD*MOD)%MOD];
while(p!=0 && val[p]!=element)
p=next[p];
if(p!=0)
return p;
return 0;
}
} H;
long long n;
long long v[MAXN+1];
inline long long f(long long len){
long long dif=0, first=1;
long long r=0;
for(long long i=1;i<=n;i++){
if(!H.find(v[i])){
H.insert(v[i], 1);
dif++;
}
else
H.d[H.find(v[i])]++;
while(dif>len){
if(H.d[H.find(v[first])]==1)
dif--;
H.erase(v[first]);
first++;
}
r+=1LL*i-1LL*first+1LL;
}
for(long long i=0;i<MOD;i++)
H.lista[i]=0;
H.k=0;
//printf("%d ", r);
return r;
}
int main(){
fi=fopen("secv5.in","r");
fo=fopen("secv5.out","w");
long long l, u;
n=nextnum(), l=nextnum(), u=nextnum();
for(long long i=1;i<=n;i++)
v[i]=nextnum();
fprintf(fo,"%lld", f(u)-f(l-1));
fclose(fi);
fclose(fo);
return 0;
}