Pagini recente » Cod sursa (job #1679830) | Cod sursa (job #1270233) | Cod sursa (job #2526051) | Cod sursa (job #343949) | Cod sursa (job #965180)
Cod sursa(job #965180)
#include<stdio.h>
#include<vector>
#define pb push_back
#define mp make_pair
#define mod 66601
using namespace std;
unsigned int n,l,u,nr,sol,st1,st2,ind1,ind2,lst2,lst1;
unsigned int v[(1<<20)+5];
vector < pair<unsigned int,unsigned int> > l1[mod],l2[mod];
int hash_imp(unsigned int k)
{
return k%mod;
}
void add1(unsigned int x)
{
int k=hash_imp(x);
for(unsigned int i=0;i<l1[k].size();i++)
if(l1[k][i].first==x)
{
l1[k][i].second++;
break;
}
l1[k].pb(mp(x,1));
}
void add2(unsigned int x)
{
int k=hash_imp(x);
for(unsigned int i=0;i<l2[k].size();i++)
if(l2[k][i].first==x)
{
l2[k][i].second++;
break;
}
l2[k].pb(mp(x,1));
}
int search1(unsigned int x)
{
int k=hash_imp(x);
ind1=ind2=-1;
for(unsigned int i=0;i<l1[k].size();i++)
if(l1[k][i].first==x)
{
if(l1[k][i].second>0) { ind1=k; ind2=i; return l1[k][i].second; }
return 0;
}
return 0;
}
int search2(unsigned int x)
{
int k=hash_imp(x);
ind1=ind2=-1;
for(unsigned int i=0;i<l2[k].size();i++)
if(l2[k][i].first==x)
{
if(l2[k][i].second>0) { ind1=k; ind2=i; return l2[k][i].second; }
return 0;
}
return 0;
}
void del1()
{
while(search1(v[st1])>1) {st1++; l1[ind1][ind2].second--;}
if(lst1>l) { st1++; l1[ind1][ind2].second--; }
}
void del2()
{
while(search2(v[st2])>1) {st2++; l2[ind1][ind2].second--;}
if(lst2>u) st2++; { l2[ind1][ind2].second--; }
}
void cit()
{
unsigned int x;
unsigned int i;
scanf("%u%u%u",&n,&l,&u);
st1=st2=1; lst1=lst2=1;
scanf("%u",&x); add1(x); add2(x); v[1]=x;
for(i=2;i<=n;i++)
{
scanf("%u",&x);
if(search1(x)==0)
{
lst1++;
if(lst1>=l) del1();
if(search2(x)==0)
{
lst2++;
if(lst2>u) del2();
}
}
add1(x); add2(x); v[i]=x;
if(lst2>=l) sol+=st1-st2+1;
}
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
cit();
printf("%u",sol);
fclose(stdin);
fclose(stdout);
return 0;
}