Cod sursa(job #833016)

Utilizator chimistuFMI Stirb Andrei chimistu Data 11 decembrie 2012 20:22:48
Problema Order Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.02 kb
#include <cstdio>
#include <cstdlib>

FILE*f=fopen("order.in","r");
FILE*g=fopen("order.out","w");
int n,arb[300000],m,val,pos,maxim,a,b;
int max(int a,int b)
{
	if (a>b)
		return a;
	return b;
}

void update(int nod,int st,int dr,int pos,int val)
{
	int mij;
	if (st==dr)
	{
		arb[nod]=val;
		return;}
	mij=(st+dr)/2;
	if (pos<=mij)
		update(2*nod,st,mij,pos,val);
	else
		update(2*nod+1,mij+1,dr,pos,val);
	arb[nod]=arb[2*nod]+arb[2*nod+1];
}

void query(int nod,int st,int dr)
{
     int mij;
    if (st == dr)
    {
       pos=st;
       return;}
    mij=(st+dr)/2;
    if (arb[2*nod]>=val)
       query(2*nod,st,mij);
    else
    {   val-=arb[2*nod];
       query(2*nod+1,mij+1,dr);}
}

int main()
{
	int i,urm;
	fscanf(f,"%d",&n);
	for (i=1;i<=n;i++)
	{
		pos=i;
		update(1,1,n,i,1);
	}
	urm=1;
	for (i=1;i<=n;i++)
	{
		urm=(urm+i+arb[1])%arb[1];
		if (urm==0) urm=arb[1];
		val=urm;
		query(1,1,n);
		update(1,1,n,pos,0);
		fprintf(g,"%d",pos);
		urm--;
	}
	return 0;
}