Cod sursa(job #88430)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 2 octombrie 2007 10:45:55
Problema Secventa 5 Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.72 kb
#include<stdio.h>
struct nod{
unsigned long int indice;
unsigned long int valoare;
nod *st;
nod *dr;
};
unsigned long int N,L,U,i,x[1050],a,b,c,cc,bb,f1[1050],f2[1050],sol,y,last_indice;
nod *radacina;
void go(nod *rr);
int main()
{
	FILE *f,*g;f=fopen("secv5.in","r");g=fopen("secv5.out","w");
	fscanf(f,"%lu%lu%lu",&N,&L,&U);
	fscanf(f,"%lu",&y);
	radacina=new nod;radacina->indice=1;radacina->valoare=y;
        radacina->st=0;radacina->dr=0;
	x[1]=1;last_indice=1;
	for(i=2;i<=N;i++)
	{       fscanf(f,"%lu",&y);
		go(radacina);
	}
	while(bb<L&&b<=N)
	{ b++;
	  if(b==N+1) { fprintf(g,"%lu\n",sol);fcloseall();return 0;}
	  f1[x[b]]++;if(f1[x[b]]==1)bb++;
	  f2[x[b]]=f1[x[b]];
	}
	c=b;cc=bb;
	while(cc<=U&&c<=N)
	{ c++;
	  if(c==N+1) cc=U;
	  else { f2[x[c]]++;if(f2[x[c]]==1)cc++;}
	}
	for(;;)
	{
		sol+=c-b;
		a++;
		f1[x[a]]--;
		if(f1[x[a]]==0) bb--;
		f2[x[a]]--;
		if(f2[x[a]]==0) cc--;
		while(bb<L&&b<=N)
		{ b++;
		  if(b==N+1) { fprintf(g,"%lu\n",sol);fcloseall();return 0;}
		  f1[x[b]]++;if(f1[x[b]]==1)bb++;
		}
		while(cc<=U&&c<=N)
		{ c++;
		  if(c==N+1) cc=U+1;
		  else { f2[x[c]]++;if(f2[x[c]]==1)cc++;}
		}
	}
}
void go(nod *rr)
{   nod *nou;
    if(rr->valoare==y){x[i]=rr->indice;return;}
    if(rr->valoare>y)
    { if(rr->st){go(rr->st);return;}
      last_indice++;
      nou=new nod;
      nou->valoare=y;
      nou->indice=last_indice;
      nou->st=0;
      nou->dr=0;
      rr->st=nou;
      x[i]=last_indice;
      return;
    }
    if(rr->dr){go(rr->dr);return;}
      last_indice++;
      nou=new nod;
      nou->valoare=y;
      nou->indice=last_indice;
      nou->st=0;
      nou->dr=0;
      x[i]=last_indice;
      rr->dr=nou;
      return;
}