Pagini recente » Cod sursa (job #2911780) | Cod sursa (job #1646638) | Cod sursa (job #2087065) | Cod sursa (job #88081) | Cod sursa (job #1238199)
#include<cstdio>
#define R 666019
using namespace std;
int lst[2][R+1];
unsigned int v[1000002];
int urm[2][1000002];
int m[2];
int cnt[2][1000002];
int k[2];
int rez;
int cauta(unsigned int x,int unde){
int tip=x%R,p;
p=lst[unde][tip];
while(p!=0){
if (v[p]==x) return p;
p=urm[unde][p];
}
return -1;
}
void adauga(unsigned int x,int unde){
int tip=x%R,p;
p=cauta(x,unde);
if (p!=-1){
cnt[unde][p]++;
return ;
}
urm[unde][m[unde]]=lst[unde][tip];
lst[unde][tip]=m[unde];
cnt[unde][m[unde]]=1;
k[unde]++;
}
void sterge(unsigned int x,int unde){
int tip=x%R,p;
p=lst[unde][tip];
if (v[p]==x){
cnt[unde][p]--;
if (cnt[unde][p]==0){
lst[unde][tip]=urm[unde][p];
k[unde]--;
}
}
while(urm[unde][p]!=0 &&v[urm[unde][p]]!=x){
p=urm[unde][p];
}
if (v[urm[unde][p]]==x){
cnt[unde][urm[unde][p]]--;
if (cnt[unde][urm[unde][p]]==0){
urm[unde][p]=urm[unde][urm[unde][p]];
k[unde]--;
}
}
}
int main(){
freopen ("secv5.in","r",stdin);
freopen ("secv5.out","w",stdout);
int n,l,u,i,p1,p2,o;
unsigned int ma=0;
scanf ("%d%d%d",&n,&l,&u);
for(i=1;i<=n;i++){
scanf ("%d",&v[i]);
if (ma<v[i]) ma=v[i];
}
m[0]=1;
m[1]=1;
p1=1;
p2=1;
v[n+1]=ma+1;
while(1!=0){
while(k[0]<l &&m[0]<=n){
adauga(v[m[0]],0);
m[0]++;
}
if (k[0]<l) {
printf ("%d\n",rez);
return 0;
}
while(k[1]<=u &&m[1]<=n+1){
adauga(v[m[1]],1);
m[1]++;
}
o=k[0];
while(k[0]==o){
sterge(v[p2],0);
sterge(v[p2],1);
p2++;
}
rez=rez+(m[1]-m[0])*(p2-p1);
p1=p2;
}
return 0;
}