Pagini recente » Cod sursa (job #1214257) | Cod sursa (job #904697) | Cod sursa (job #2680970) | Cod sursa (job #1742428) | Cod sursa (job #88809)
Cod sursa(job #88809)
#include<stdio.h>
#include<stdlib.h>
struct nod{
unsigned long int contor;
unsigned long int valoare;
nod *next;
};
unsigned long int N,L,U,i,x[1048583],a,b,c,cc,bb,sol,vn,pp;
nod *p1[100005],*u1[100005],*p2[100005],*u2[100005],*q,*r;
void in1(unsigned long int vv);
void out1(unsigned long int vv);
void in2(unsigned long int vv);
void out2(unsigned long int vv);
int main()
{
FILE *f,*g;
f=fopen("secv5.in","r");
g=fopen("secv5.out","w");
fscanf(f,"%lu%lu%lu",&N,&L,&U);
for(i=1;i<=N;i++){fscanf(f,"%lu",&x[i]);}
pp=100003;
while(bb<L&&b<=N)
{ b++;
if(b==N+1) { fprintf(g,"%lu\n",sol);fcloseall();return 0;}
in1(x[b]);in2(x[b]);
}
c=b;cc=bb;
while(cc<=U&&c<=N)
{ c++;
if(c==N+1) cc=U+1;
else in2(x[c]);
}
for(;;)
{
sol+=c-b;a++;
out1(x[a]);
out2(x[a]);
while(bb<L&&b<=N)
{ b++;
if(b==N+1) { fprintf(g,"%lu\n",sol);fcloseall();return 0;}
in1(x[b]);
}
while(cc<=U&&c<=N)
{ c++;
if(c==N+1) cc=U+1;
else in2(x[c]);
}
}
}
void in1(unsigned long int vv)
{
nod *nou;
vn=vv%pp;
if(p1[vn])
{ q=p1[vn];
while(q)
if(q->valoare==vv){q->contor++;return;}
nou=new nod;nou->valoare=vv;nou->contor=1;nou->next=0;bb++;
u1[vn]->next=nou;u1[vn]=nou;
}
nou=new nod;nou->valoare=vv;nou->contor=1;bb++;
p1[vn]=nou;u1[vn]=nou;
}
void out1(unsigned long int vv)
{
nod *paux;
vn=vv%pp;
if(p1[vn]->valoare==vv)
{ p1[vn]->contor--;
if(!p1[vn]->contor)
{ bb--;paux=p1[vn];p1[vn]=paux->next;free(paux);}
return;
}
q=p1[vn];r=q->next;
while(r->valoare!=vv){q=q->next;r=q->next;}
r->contor--;
if(!r->contor)
{ bb--;paux=r;q->next=r->next;free(paux);}
}
void in2(unsigned long int vv)
{
nod *nou;
vn=vv%pp;
if(p2[vn])
{ q=p2[vn];
while(q)if(q->valoare==vv){q->contor++;return;}
nou=new nod;nou->valoare=vv;nou->contor=1;nou->next=0;bb++;
u2[vn]->next=nou;u2[vn]=nou;return;
}
nou=new nod;nou->valoare=vv;nou->contor=1;cc++;
p2[vn]=nou;u2[vn]=nou;
}
void out2(unsigned long int vv)
{
nod *paux;
vn=vv%pp;
if(p2[vn]->valoare==vv)
{ p2[vn]->contor--;
if(!p2[vn]->contor)
{ cc--;paux=p2[vn];p2[vn]=paux->next;free(paux);}
return;
}
q=p2[vn];r=q->next;
while(r->valoare!=vv){q=q->next;r=q->next;}
r->contor--;
if(!r->contor)
{ cc--;paux=r;q->next=r->next;free(paux);}
}