Pagini recente » Cod sursa (job #2627282) | Cod sursa (job #3188647) | Cod sursa (job #2397491) | Cod sursa (job #802127) | Cod sursa (job #1820398)
#include<stdio.h>
#include<vector>
#define MAXN (1<<20)
using namespace std;
#define MOD 666019
struct bine { int nr ; int fr ;};
bine p;
vector<bine>h1[MOD+1],h2[MOD+1];
int v[MAXN+1];
void add1 ( int x ){
int cx,pp,i;
cx=x%MOD;
pp=1;
for(i=0;i<h1[cx].size()&&pp==1;i++)
if(h1[cx][i].nr==x)
pp=0;
if(pp==0){
i--;
h1[cx][i].fr++;
}
else{
p.nr=x;
p.fr=1;
h1[cx].push_back(p);
}
}
void add2 ( int x ){
int cx,pp,i;
cx=x%MOD;
pp=1;
for(i=0;i<h2[cx].size()&&pp==1;i++)
if(h2[cx][i].nr==x)
pp=0;
if(pp==0){
i--;
h2[cx][i].fr++;
}
else{
p.nr=x;
p.fr=1;
h2[cx].push_back(p);
}
}
int check1 ( int x ){
int cx,pp,i;
cx=x%MOD;
pp=1;
for(i=0;i<h1[cx].size()&&pp==1;i++)
if(h1[cx][i].nr==x)
pp=0;
if(pp==1)
return 0;
return 1;
}
int check2 ( int x ){
int cx,pp,i;
cx=x%MOD;
pp=1;
for(i=0;i<h2[cx].size()&&pp==1;i++)
if(h2[cx][i].nr==x)
pp=0;
if(pp==1)
return 0;
return 1;
}
void sterge1 ( int x ){
int cx,pp=1,i;
cx=x%MOD;
for(i=0;i<h1[cx].size()&&pp==1;i++)
if(h1[cx][i].nr==x)
pp=0;
i--;
h1[cx][i].fr--;
if(h1[cx][i].fr==0){
swap(h1[cx][i],h1[cx][h1[cx].size()-1]);
h1[cx].pop_back();
}
}
void sterge2 ( int x ){
int cx,pp=1,i;
cx=x%MOD;
for(i=0;i<h2[cx].size()&&pp==1;i++)
if(h2[cx][i].nr==x)
pp=0;
i--;
h2[cx][i].fr--;
if(h2[cx][i].fr==0){
swap(h2[cx][i],h2[cx][h2[cx].size()-1]);
h2[cx].pop_back();
}
}
int main(){
int n,i,x1,x2,lmin,lmax,difmin,difmax;
long long ans=0;
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%d%d%d",&n,&x1,&x2);
for(i=1;i<=n;i++)
scanf("%d",&v[i]);
lmin=0;lmax=0; difmin=0;difmax=0;
for(i=1;i<=n;i++){
while(difmin!=x1 && lmin <n){
lmin++;
if(check1(v[lmin])==0)
difmin++;
add1(v[lmin]);
}
while(difmax<=x2 && lmax <n){
if(difmax<x2){
lmax++;
if(check2(v[lmax])==0)
difmax++;
add2(v[lmax]);
}
else{
if(check2(v[lmax+1])!=0){
add2(v[lmax+1]);
lmax++;
}
}
}
if(difmin == x1)
ans=ans+(lmax-lmin+1);
sterge1(v[i]);
if(check1(v[i])==0)
difmin--;
sterge2(v[i]);
if(check2(v[i])==0)
difmax--;
}
printf("%lld\n",ans);
return 0;
}