Pagini recente » Cod sursa (job #2632218) | Cod sursa (job #71201) | Cod sursa (job #1360079) | Cod sursa (job #2658933) | Cod sursa (job #1236487)
#include <stdio.h>
using namespace std;
const int R=666013;
const int N=(1<<20) +1;
int lst[2][R],val[2][N],urm[2][N];
int v[N],nr[2];
int ind;
void adauga (int x)
{
int tip=x%R;
nr[ind]++;
val[ind][nr[ind]]=x;
urm[ind][nr[ind]]=lst[ind][tip];
lst[ind][tip]=nr[ind];
}
void sterge (int x)
{
int tip=x%R,p;
p=lst[ind][tip];
if(x==val[ind][p])
lst[ind][tip]=urm[ind][p];
while(urm[ind][p]!=0)
{
if(x==val[ind][urm[ind][p]])
{
urm[ind][p]=urm[ind][urm[ind][p]];
return;
}
p=urm[ind][p];
}
}
bool exista (int x)
{
int tip=x%R,p;
p=lst[ind][tip];
while(p!=0)
{
if(x==val[ind][p])
return 1;
p=urm[ind][p];
}
return 0;
}
int main ()
{
FILE *in,*out;
in=fopen("secv5.in","r");
out=fopen("secv5.out","w");
int i,j,k,n,L,U,dj,dk,ns;
fscanf(in,"%d%d%d",&n,&L,&U);
for(i=0;i<n;i++)
fscanf(in,"%d",&v[i]);
j=k=0;
dj=dk=0;
ns=0;
for(i=0;i<n;i++)
{
ind=0;
//actualizeaza j si dj
while(j<n && dj<L)
{
if(!exista(v[j]))
dj++;
adauga(v[j]);
//printf("adaug %d\n",v[j]);
j++;
}
ind=1;
//actualizeaza k si dk
if(k<n && dk<=U)
{
while(k<n && dk<=U)
{
//printf("v[k]=%d; ",v[k]);
if(!exista(v[k]))
{
//printf("NU EXISTA!\n");
dk++;
}
adauga(v[k]);
k++;
}
if(dk==U+1)
k--;
}
//printf("i=%d, j=%d, k=%d\n",i,j,k);
if(dj==L)
ns+=k-j+1;
//elimina elementul de la inceput
ind=0;
//printf("sterg %d din 0\n",v[i]);
sterge(v[i]);
if(!exista(v[i]))
{
//printf("%d nu mai exista in 0!\n",v[i]);
dj--;
}
ind=1;
//printf("sterg %d din 1\n",v[i]);
sterge(v[i]);
if(!exista(v[i]))
{
//printf("%d nu mai exista in 1!\n",v[i]);
dk--;
}
//printf("ns=%d\n",ns);
}
fprintf(out,"%d\n",ns);
}