Cod sursa(job #88807)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 4 octombrie 2007 09:56:54
Problema Secventa 5 Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.33 kb
#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;
	  else in2(x[b]);
	}
	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);}
}