Pagini recente » Cod sursa (job #328211) | Cod sursa (job #2184311) | Arhiva de probleme | Cod sursa (job #2685437) | Cod sursa (job #1641372)
#include <cstdio>
#include <algorithm>
using namespace std;
int n,p,u,i,v[1050000],ap[1050000],x,stg,dr,nr,sol,sol1,sol2,dst;
struct str
{
int val, pos;
}in[1050000];
bool cmp(str a,str b)
{
if(a.val<b.val) return 1;
else
if(a.val==b.val&&a.pos<b.pos) return 1;
return 0;
}
int main()
{
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%d%d%d",&n,&p,&u);
for(i=1;i<=n;i++)
{
scanf("%d",&in[i].val);
in[i].pos=i;
}
x=0;
sort(in+1,in+n+1,cmp);
for(i=1;i<=n;i++)
{
if(in[i].val!=in[i-1].val)
x++;
v[in[i].pos]=x;
}
dr = 0;
dst = 0 ;// nr de numere distincte
x=u;
for(i = 1; i <= n; i++)
{
while(dst <= x && dr < n)
{
if(ap[ v[dr + 1] ] == 0 && dst == x) break;
dr++;
ap[ v[dr] ]++;
if(ap[ v[dr] ] == 1) dst++;
}
sol = sol + (dr - i + 1);
ap[ v[i] ]--;
if(ap[ v[i] ] == 0) dst--;
}
for(i=1;i<=1040000;i++) ap[i]=0;
sol1=sol;
dr = 0;
dst = 0 ;
x=p-1;
for(i = 1; i <= n; i++)
{
while(dst <= x && dr < n)
{
if(ap[ v[dr + 1] ] == 0 && dst == x) break;
dr++;
ap[ v[dr] ]++;
if(ap[ v[dr] ] == 1) dst++;
}
sol = sol + (dr - i + 1);
ap[ v[i] ]--;
if(ap[ v[i] ] == 0) dst--;
}
sol2=sol;
printf("%d",sol2-sol1+1);
return 0;
}