Cod sursa(job #86744)

Utilizator anna_bozianuBozianu Ana anna_bozianu Data 25 septembrie 2007 14:16:10
Problema Curcubeu Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.41 kb
#include<stdio.h>
struct nod
{long long int st;long long int dr;long long int cl;nod *next;};
nod *prim,*ultim,*cursor;
long long int n,a1,b1,c1,i,a,b,c,aux,fact[1000010];
void split1();
void split2();
int main()
{
	FILE *f,*g;f=fopen("curcubeu.in","r");g=fopen("curcubeu.out","w");
	fscanf(f,"%lld%lld%lld%lld",&n,&a1,&b1,&c1);
	fact[1]=1;
	for(i=2;i<n;i++)fact[i]=(fact[i-1]*i)%n;
	prim=new nod;
	prim->st=1;prim->dr=n-1;prim->cl=0;prim->next=0;
	ultim=prim;
	for(i=n-1;i>=1;i--)
	{ a=(a1*fact[i])%n;b=(b1*fact[i])%n;c=(c1*fact[i])%n;
	  if(a>b){aux=a;a=b;b=aux;}
	  cursor=prim;
	  while(cursor->dr<a)cursor=cursor->next;
	  if(cursor->cl){a=cursor->dr+1;cursor=cursor->next;}
	  else if(cursor->st<a)split1();
	  while(cursor)
	  { if(a>b)cursor=0;
	     else if(cursor->cl)
		 { a=cursor->dr+1;cursor=cursor->next;}
	      else if(cursor->dr<=b)
		 { cursor->cl=c;a=cursor->dr+1;cursor=cursor->next;}
	       else split2();
	  }
	}
	cursor=prim;
	while(cursor)
	{ for(i=cursor->st;i<=cursor->dr;i++)
	  fprintf(g,"%lld\n",cursor->cl);
	  cursor=cursor->next;
	}
	fcloseall();
	return 0;
}
void split1()
{
	nod *sp;
	sp=new nod;
	sp->st=a;sp->dr=cursor->dr;sp->cl=0;sp->next=cursor->next;
	cursor->dr=a-1;cursor->next=sp;cursor=sp;
}
void split2()
{
	nod *sp;
	sp=new nod;
	sp->st=b+1;sp->dr=cursor->dr;sp->cl=0;sp->next=cursor->next;
	cursor->dr=b;cursor->next=sp;cursor->cl=c;cursor=0;
}