Pagini recente » Cod sursa (job #3203529) | Cod sursa (job #914490) | Cod sursa (job #2070000) | Cod sursa (job #2778676) | Cod sursa (job #381381)
Cod sursa(job #381381)
#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;
}
int calc(int x)
{
if(x==0)
return 0;
int i,poz,sol=1,nr=1;
poz=0;
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++;
}
sol=sol+i-poz+1;
}
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();
}
int sol=calc(u);
memset(f,0,sizeof(f));
sol=sol-calc(p-1);
printf("%d\n",sol);
return 0;
}