Cod sursa(job #134911)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 12 februarie 2008 17:25:19
Problema Schi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.28 kb
#include<stdio.h>
long int p0[655],p1[655],p2[655],pf[655],n,i;
void arbore(long int nod,long int left,long int right);
void remake(long int nod,long int left,long int right);
int main()
{
	FILE *f,*g;f=fopen("schi.in","r");g=fopen("schi.out","w");
	fscanf(f,"%ld",&n);
	for(i=1;i<=n;i++)fscanf(f,"%ld",&p0[i]);
	arbore(1,1,n);
	for(i=1;i<=n;i++)
	{ paux=p2[1];fprintf(g,"%ld\n",paux);
	  if(p2[1]>1){x=1;y=p2[1]-1;vr=1;remake(1,1,n);
	  x=paux;y=paux;vr=65536;remake(1,1,n);
	}
	fcloseall();
	return 0;
}
void arbore(long int nod,long int left,long int right)
{
	long int fs,fd,middle;
	fs=2*nod;fd=2*nod+1;
	if(left>right)return;
	if(left==right){p1[nod]=p0[left];p2[nod]=left;}
	middle=(left+right)>>1;
	arbore(fs,left,middle);
	arbore(fd,middle+1,right);
	if(p1[fd]<=p1[fs]){p1[nod]=p1[fd];p2[nod]=p2[fd];return;}
	p1[nod]=p1[fs];p2[nod]=p2[fs];
}
void remake(long int nod,long int left,long int right)
{
	long int fs,fd,middle;
	fs=2*nod;fd=2*nod+1;
	if(x<=left&&right<=y){p1[nod]+=vr;pf[nod]+=vr;return;}
	if(left==right){p1[nod]=p0[left];p2[nod]=left;}
	middle=(left+right)>>1;
	if(x<=middle)remake(fs,left,middle);
	if(y>middle)remake(fd,middle+1,right);
	if(p1[fd]<=p1[fs]){p1[nod]=p1[fd]+pf[nod];p2[nod]=p2[fd];return;}
	p1[nod]=p1[fs]+pf[nod];p2[nod]=p2[fs];
}