Cod sursa(job #30704)

Utilizator crusRus Cristian crus Data 14 martie 2007 21:57:44
Problema Order Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.25 kb
#include <stdio.h>
#define input "order.in"
#define output "order.out"
int n,lung,pz,i;
FILE *fout;
struct nod{int cati,nr; nod *st,*dr;} *prim,*q;
void citire()
{
	FILE *fin;
	fin=fopen(input,"r");
	fscanf(fin,"%d",&n);
	fclose(fin);
}
void creaza(nod *prim, int ls, int ld)
{
	int k;
	prim->cati=ld-ls+1;
	if (prim->cati==1)		
		 prim->nr=ls;
		else
			{
			 k=(int)((ls+ld)/2);
			 prim->nr=0;
			 q=new nod;
			 prim->st=q;
			 q=new nod;
			 prim->dr=q;
			 creaza(prim->st,ls,k);
			 creaza(prim->dr,k+1,ld);
			}
}
void cauta(nod *prim, int pozitie)
{
	if (prim->nr>0) 
		{
		 fprintf(fout,"%d ",prim->nr);
		 prim->cati--;
		 prim->nr=0;
		}
		else 
			{
			prim->cati--;
			if (prim->st->cati>=pozitie) cauta(prim->st,pozitie);
			   else cauta(prim->dr,pozitie-prim->st->cati);			   			
			}
}
void rsd(nod *prim)
{
	if (prim->nr) fprintf(fout,"%d\n",prim->nr);
	   else
		{
		   rsd(prim->st);
		   rsd(prim->dr);
		}
}
int main()
{
	citire();
	prim=new nod;	
	creaza(prim,1,n);	
	fout=fopen(output,"w");
	pz=2;
	lung=n;
	for (i=1;i<n;i++)
		{
		 pz=(pz-1+i)%lung;		 
		 if (pz==0) pz=lung;
		 lung--;
		 cauta(prim,pz);
		}
	pz=pz;
	cauta(prim,1);
//  rsd(prim);
	fclose(fout);
	return 0;
}