Pagini recente » Cod sursa (job #2964134) | Cod sursa (job #834893) | Cod sursa (job #2801484) | Cod sursa (job #1785579) | Cod sursa (job #1766519)
#include <cstdio>
#include <cstdlib>
#include <algorithm>
#define MOD 2000000
using namespace std;
int v[2000000],f[2000000],lista[2000000],urm[2000000],vv[2000000],nad;
struct gogu
{
unsigned val;int p;
}vc[2000000];
bool comp(gogu a,gogu b)
{
return a.val<b.val;
}
int adauga(int x)
{
int p;
if(lista[x%MOD]==0)
{
nad++;
urm[nad]=0;
lista[x%MOD]=nad;
f[nad]=1;
v[nad]=x;
return 1;
}
else
{
p=lista[x%MOD];
if(v[p]>=x)
{
if(v[p]==x){ f[p]++; return 0; }
else
{
nad++;
v[nad]=x;
lista[x%MOD]=nad;
urm[nad]=p;
}
f[nad]=1;
return 1;
}
else
{
while(urm[p]!=0 && v[urm[p]]<x) p=urm[p];
if(v[urm[p]]==x){ f[urm[p]]++; return 0; }
else
{
nad++;
urm[nad]=urm[p];
urm[p]=nad;
f[nad]=1;
v[nad]=x;
return 1;
}
}
}
}
int sterge(int x)
{
int p=lista[x%MOD];
if(v[p]>=x){
if(v[p]==x && f[p]>1){
f[p]--;
return 0;
}
else
{
if(v[p]==x){
f[p]=0;
lista[x%MOD]=urm[p];
return 1;
}
}
}
else{
while(urm[p]!=0 && v[urm[p]]<x) p=urm[p];
if(v[urm[p]]==x)
{
if(f[p]>1)
{
f[p]--;
return 0;
}
else
{
f[p]=0;
urm[p]=urm[urm[p]];
return 1;
}
}
return 0;
}
}
int sol(int x,int n)
{
int nr=0,i,sum=0,j;
nad=0;
if(x!=0){
for(i=1; nr<=x && i<=n; i++)
nr+=adauga(vv[i]);
if(nr>x)
nr-=sterge(vv[--i]);
i--;
sum+=i;
for(j=2; j<=n; j++)
{
nr-=sterge(vv[j-1]);
while(i<=n && nr<=x)
nr+=adauga(vv[++i]);
nr-=sterge(vv[i--]);
sum+=(i-j+1);
}
for(i=1; i<=n; i++)
lista[i]=urm[i]=f[i]=v[i]=0;
return sum;
}
return 0;
}
int main()
{
int n,l,u,i,nr,j,z;
freopen("secv5.in","r",stdin);
freopen("secv5.out","w",stdout);
scanf("%d%d%d",&n,&l,&u);
for(i=1; i<=n; i++){
scanf("%u",&vc[i].val);
vc[i].p=i;
}
sort(vc+1,vc+n+1,comp);
nr=0;
for(i=1; i<=n;)
{
j=i;
nr++;
z=vc[i].val;
while(j<=n && z==vc[j].val) vc[j].val=nr,j++;
i=j;
}
for(i=1; i<=n; i++)
vv[vc[i].p]=vc[i].val;
printf("%d\n",sol(u,n)-sol(l-1,n));
return 0;
}