Pagini recente » Cod sursa (job #1321360) | Cod sursa (job #112922) | Cod sursa (job #1615361) | Cod sursa (job #1652993) | Cod sursa (job #594971)
Cod sursa(job #594971)
#include <cstdio>
#include <vector>
using namespace std;
struct str
{
unsigned int val;
int ind;
};
vector <str> h[200003];
int v[1048577],vl[1048577],vr[1048577];
int main()
{
int i,n,p,q,cnt=0,l=1,r=1,a,sol=0;
unsigned int j,x;
str aux;
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%u %u %u\n",&n,&p,&q);
for (i=1;i<=n;++i)
{
scanf("%u\n",&x);
a=x%200003;
for (j=0;j<h[a].size();++j)
if (h[a][j].val==x)
break;
if (j==h[a].size())
{
++cnt;
aux.ind=cnt;
aux.val=x;
h[a].push_back(aux);
v[i]=cnt;
}
else
v[i]=h[a][j].ind;
}
cnt=0;
for (i=1;i<=n&&cnt<p;++i)
{
++vl[v[i]];
++vr[v[i]];
if (vl[v[i]]==1)
++cnt;
}
while (vr[v[r]]>1)
{
--vr[v[r]];
++r;
}
if (cnt==p)
sol+=r;
for (;i<=n&&cnt<q;++i)
{
++vl[v[i]];
++vr[v[i]];
if (vr[v[i]]==1)
{
if (vl[v[i]]==1)
++cnt;
while (vr[v[r]]>1)
{
--vr[v[r]];
++r;
}
--vr[v[r]];
++r;
}
while (vr[v[r]]>1)
{
--vr[v[r]];
++r;
}
sol+=r;
}
for (;i<=n;++i)
{
++vl[v[i]];
++vr[v[i]];
if (vr[v[i]]==1)
{
while (vr[v[r]]>1)
{
--vr[v[r]];
++r;
}
--vr[v[r]];
++r;
if (vl[v[i]]==1)
{
while (vl[v[l]]>1)
{
--vl[v[l]];
++l;
}
--vl[v[l]];
++l;
}
}
while (vr[v[r]]>1)
{
--vr[v[r]];
++r;
}
sol+=r-l+1;
}
printf("%d",sol);
return 0;
}