Pagini recente » Cod sursa (job #2757722) | Runda 2 preONI 2007 | Cod sursa (job #791259) | Cod sursa (job #3213338) | Cod sursa (job #1321100)
#include<stdio.h>
#include<string.h>
#define f first
#define s second
#include<vector>
using namespace std;
#define prim 666013
#define nmax 1<<20
int n,lin,nr=-1,v[1<<nmax],f[1<<nmax];
unsigned int val;
vector< pair<unsigned int,int> > h[prim+2];
int cautare()
{
lin=val%prim;
int i,lim=h[lin].size();
for(i=0;i<lim;i++)
if(val==h[lin][i].f)
return i;
return -1;
}
int insert()
{
int poz=cautare();
if(poz==-1)
{
h[lin].push_back(make_pair(val,++nr));
return nr;
}
return h[lin][poz].s;
}
long long calc(int x)
{
if(x==0)
return 0;
int i,poz=0,nr=1;
long long sol=1;
f[v[0]]=1;
for(i=1;i<n;i++)
{
f[v[i]]++;
if(f[v[i]]==1)
nr++;
while(nr>x)
{
f[v[poz]]--;
if(f[v[poz]]==0)
nr--;
poz++;
}
// printf("sol inainte de %d e %lld\n",i,sol);
sol=sol+i-poz+1;
// printf("sol la pasul %d e %lld\n",i,sol);
}
return sol;
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
int p,u;
scanf("%d%d%d",&n,&p,&u);
int i;
for(i=0;i<n;i++)
{
scanf("%u",&v[i]);
val=v[i];
v[i]=insert();
}
long long sol=calc(u);
memset(f,0,sizeof(f));
sol=sol-calc(p-1);
printf("%lld\n",sol);
return 0;
}