Pagini recente » Cod sursa (job #1682385) | Cod sursa (job #1644041) | Cod sursa (job #2999829) | Cod sursa (job #1574561) | Cod sursa (job #9736)
Cod sursa(job #9736)
#include<stdio.h>
#include<stdlib.h>
#define max 1100000
unsigned long k,nr,d[max],v[max],dd[max];
long long m,n,l,u,op;
int cmp(const void *x, const void *y)
{
unsigned long *xx=(unsigned long *)x;
unsigned long *yy=(unsigned long *)y;
if(*xx>*yy) return 1;
if(*xx<*yy) return -1;
return 0;
}
void READ()
{ unsigned long i;
FILE *f;
f=fopen("secv5.in","r");
fscanf(f,"%lld %lld %lld",&n,&l,&u);
for(i=1;i<=n;i++)
{ fscanf(f,"%lld",&op);
d[i]=op;
dd[i]=d[i]; }
qsort(dd+1,n,sizeof(unsigned long),cmp);
fclose(f);
}
unsigned long caut(unsigned long k)
{
long long step;
unsigned long w;
for(step=1;step*2<=n;step<<=1);
for(w=0;step;step>>=1)
if(w+step<n && dd[w+step]<k) w=w+step;
return w;
}
void SOLVE()
{ unsigned long i,w;
m=0; k=1; nr=0;
//prima parte
for(i=1;i<=n;i++)
{
w=caut(d[i])+1;
if(v[w]==0) nr++;
v[w]++;
while(nr==l)
{ w=caut(d[k])+1;
v[w]--;
if(!v[w]) nr--;
k++;
}
m+=i-k+1;
} for(i=k;i<=n;i++) { w=caut(d[i])+1; v[w]--; }
//a doua parte
k=1; nr=0;
for(i=1;i<=n;i++)
{
w=caut(d[i])+1;
if(v[w]==0) nr++;
v[w]++;
while(nr>u)
{ w=caut(d[k])+1;
m+=n-i+1;
v[w]--;
if(!v[w]) nr--;
k++;
}
}
m=n*(n+1)/2-m;
}
void PRINT()
{
FILE *g;
g=fopen("secv5.out","w");
fprintf(g,"%lld\n",m);
fclose(g);
}
int main()
{
READ();
SOLVE();
PRINT();
return 0;
}