Pagini recente » Cod sursa (job #348409) | Cod sursa (job #2564639) | Borderou de evaluare (job #2271036) | Cod sursa (job #16783) | Cod sursa (job #673430)
Cod sursa(job #673430)
#include<cstdio>
#include<fstream>
using namespace std;
const int MOD=678133;
const int dim=(1<<20)+10;
struct Nod{
int val;
long long x;
Nod *urm;
}*H[MOD];
int N,L,U,M;
int nr[dim],apar[dim];
int add(long long x){
int rr=x%MOD;
Nod *ax;
ax=H[rr];
while(ax){
if(ax->x==x)
return ax->val;
ax=ax->urm;
}
ax=new Nod;
ax->x=x;
ax->val=++M;
ax->urm=H[rr];
H[rr]=ax;
return ax->val;
}
long long solve(int D){
long long sol=0;
int i,ex,st;
for(i=0;i<=M;++i)
apar[i]=0;
for(i=0,ex=0,st=0;i<N;++i){
if(apar[nr[i]])
++apar[nr[i]];
else{
++apar[nr[i]];
++ex;
}
while(ex>D){
--apar[nr[st]];
if(apar[nr[st]]==0)
--ex;
++st;
}
sol+=i-st+1;
}
return sol;
}
int main(){
//freopen("secv5.in","r",stdin);
ifstream f("secv5.in");
freopen("secv5.out","w",stdout);
int i;
long long x;
//scanf("%d%d%d",&N,&L,&U);
f>>N>>L>>U;
for(i=0;i<N;++i){
//scanf("%lld",&x);
f>>x;
nr[i]=add(x);
}
printf("%lld\n",solve(U)-solve(L-1));
fclose(stdin);
fclose(stdout);
return 0;
}