Pagini recente » Cod sursa (job #536395) | Cod sursa (job #2527515) | Cod sursa (job #676461) | Cod sursa (job #283298) | Cod sursa (job #1820402)
#include<stdio.h>
#include<vector>
#define MAXN (1<<20)
using namespace std;
#define MOD 666019
struct bine { unsigned int nr ; unsigned int fr ;};
bine p;
vector<bine>h1[MOD+1],h2[MOD+1];
unsigned int v[MAXN+1];
void add1 ( unsigned int x ){
unsigned 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 ( unsigned int x ){
unsigned 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);
}
}
unsigned int check1 ( unsigned int x ){
unsigned 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;
}
unsigned int check2 ( unsigned int x ){
unsigned 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 ( unsigned int x ){
unsigned 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 ( unsigned int x ){
unsigned 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(){
unsigned int n,i,x1,x2,lmin,lmax,difmin,difmax;
long long ans=0;
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%u%u%u",&n,&x1,&x2);
for(i=1;i<=n;i++)
scanf("%u",&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){
lmax++;
if(check2(v[lmax])==0)
difmax++;
add2(v[lmax]);
}
while(difmax == x2 && lmax < n && check2(v[lmax+1]) == 1)
{lmax++; add2(v[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;
}