Pagini recente » Cod sursa (job #1270331) | Cod sursa (job #15056) | Cod sursa (job #2183463) | Monitorul de evaluare | Cod sursa (job #673445)
Cod sursa(job #673445)
#include<cstdio>
#include<fstream>
#include<algorithm>
#include<vector>
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;
}*/
typedef pair<unsigned int,int> PLI;
vector <PLI> H(dim);
long long solve(int D){
long long sol=0;
int i,ex,st;
if(D!=U)
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+=(long long)i-st+1;
}
return sol;
}
int main(){
//freopen("secv5.in","r",stdin);
ifstream f("secv5.in");
freopen("secv5.out","w",stdout);
int i;
unsigned int x;
//scanf("%d%d%d",&N,&L,&U);
f>>N>>L>>U;
for(i=1;i<=N;++i){
//scanf("%lld",&x);
f>>x;
H[i].first=x;
H[i].second=i;
}
sort(H.begin()+1,H.begin()+N+1);
H[0].first=H[1].first+1;
for(i=1;i<=N;++i){
if(H[i].first!=H[i-1].first)
++M;
nr[H[i].second-1]=M;
}
printf("%lld\n",solve(U)-solve(L-1));
fclose(stdin);
fclose(stdout);
return 0;
}