Pagini recente » Cod sursa (job #489112) | Cod sursa (job #2086057) | Cod sursa (job #294055) | Cod sursa (job #959087) | Cod sursa (job #14538)
Cod sursa(job #14538)
#include <stdio.h>
#include <string.h>
int n,l,u,st1,nrst1,st2,nrst2,nrSecv,v[1050000],a[1050000];
void qSort(int st,int dr)
{
int i=st, j=dr, m=v[(i+j)/2];
do
{
while (v[i]<m) i++;
while (v[j]>m) j--;
if (i<=j)
{
int aux=v[i]; v[i]=v[j]; v[j]=aux;
i++; j--;
}
}
while (i<=j);
if (st<j) qSort(st,j);
if (i<dr) qSort(i,dr);
}
int main()
{
freopen("secv5.in","r",stdin);
scanf("%d %d %d",&n,&l,&u);
for (int i=0;i<n;i++) scanf("%d",&a[i]),v[i]=a[i];
qSort(0,n-1);
int poz=1;
for (int i=1;i<n;i++)
if (v[i]>v[i-1]) v[poz++]=v[i];
for (int i=0;i<n;i++)
{
int st=0,dr=poz-1;
while (st<=dr)
{
int m=(st+dr)/2;
if (v[m]==a[i]) st=m,dr=st-1;
else if (v[m]<a[i]) st=m+1;
else dr=m-1;
}
a[i]=st;
}
memset(v,0,sizeof(v));
v[a[0]]=1;
st1=0; nrst1=1;
st2=0; nrst2=1;
if (l==1) nrSecv=1;
else nrSecv=0;
for (int i=1;i<n;i++)
{
if (v[a[i]]) v[a[i]]++;
else {
v[a[i]]=1;
nrst1++; nrst2++;
while (nrst1>u) {
v[a[st1]]--;
if (v[a[st1]]==0) nrst1--;
st1++;
}
while (nrst2>l) {
v[a[st2]]--;
if (v[a[st2]]==0) nrst2--;
st2++;
}
}
while (v[a[st2]]>1) v[a[st2++]]--;
if (nrst2>=l) nrSecv+=st2-st1+1;
}
freopen("secv5.out","w",stdout);
printf("%d\n",nrSecv);
fclose(stdout);
return 0;
}