Cod sursa(job #9736)

Utilizator t30Rosu Teodor t30 Data 27 ianuarie 2007 16:51:59
Problema Secventa 5 Scor 50
Compilator cpp Status done
Runda Unirea 2007, clasele 11-12 Marime 1.45 kb
#include<stdio.h>
#include<stdlib.h>
#define max 1100000
unsigned long k,nr,d[max],v[max],dd[max];
long long m,n,l,u,op;

int cmp(const void *x, const void *y)
{
  unsigned long *xx=(unsigned long *)x;
  unsigned long *yy=(unsigned long *)y;
  if(*xx>*yy) return 1;
  if(*xx<*yy) return -1;
  return 0;
}

void READ()
{  unsigned long i;
	FILE *f;
	f=fopen("secv5.in","r");
	fscanf(f,"%lld %lld %lld",&n,&l,&u);


	for(i=1;i<=n;i++)
	{  fscanf(f,"%lld",&op);
	    d[i]=op;
		dd[i]=d[i]; }

	qsort(dd+1,n,sizeof(unsigned long),cmp);
	fclose(f);
}
unsigned long caut(unsigned long k)
{
  long long step;
  unsigned long w;
  for(step=1;step*2<=n;step<<=1);
  for(w=0;step;step>>=1)
	 if(w+step<n && dd[w+step]<k) w=w+step;
  return w;
}

void SOLVE()
{  unsigned long i,w;

  m=0; k=1; nr=0;

  //prima parte
  for(i=1;i<=n;i++)
  {
	w=caut(d[i])+1;
	if(v[w]==0) nr++;
		v[w]++;

		while(nr==l)
		  { w=caut(d[k])+1;
			 v[w]--;
			 if(!v[w]) nr--;
			 k++;
		  }
		m+=i-k+1;

	} for(i=k;i<=n;i++) { w=caut(d[i])+1; v[w]--; }

	//a doua parte
	k=1; nr=0;
	for(i=1;i<=n;i++)
	{
		w=caut(d[i])+1;
		if(v[w]==0) nr++;
		v[w]++;

		while(nr>u)
		  { w=caut(d[k])+1;
			 m+=n-i+1;
			 v[w]--;
			 if(!v[w]) nr--;
			 k++;
		  }


	}
	m=n*(n+1)/2-m;
}
void PRINT()
{
  FILE *g;
  g=fopen("secv5.out","w");
  fprintf(g,"%lld\n",m);
  fclose(g);
}

int main()
{
READ();
SOLVE();
PRINT();
return 0;
}