Cod sursa(job #85937)

Utilizator MarcvsHdrMihai Leonte MarcvsHdr Data 23 septembrie 2007 11:51:26
Problema Curcubeu Scor 20
Compilator cpp Status done
Runda Autumn Warmup 2007, Runda 2 Marime 2.44 kb
# include <stdio.h>
# include <stdlib.h>

const long int MAXN=1000000;

typedef struct NODL {long int inf; NODL *next;};
typedef struct LISTA{NODL *prim,*ultim;};
LISTA beg[MAXN+1]={NULL,NULL},end[MAXN+1]={NULL,NULL};
long int heap[MAXN+1],heaplen,n,final[MAXN+1],culoare[MAXN+1],used[MAXN+1];

void rise_heap(long int i)
{
long int aux;
while (i>1&&heap[i/2]<heap[i])
	{
	aux=heap[i];
	heap[i]=heap[i/2];
	heap[i/2]=aux;
	i/=2;
	}
}

void submerge_heap(long int i)
{
long int min,aux;
do
	{
	min=i;
	if (2*i<=heaplen&&heap[2*i]>heap[min]) min=2*i;
	if (2*i+1<=heaplen&&heap[2*i+1]>heap[min]) min=2*i+1;
	if (min==i) break;
	aux=heap[i];
	heap[i]=heap[min];
	heap[min]=aux;
	i=min;
	}
while (1);
}



long int add(LISTA &l,long int inf,long int pos)
{
NODL *p=(NODL*) malloc (sizeof(NODL));
(*p).inf=inf;
if (l.prim==NULL&&l.ultim==NULL)
	{
	(*p).next=NULL;
	l.prim=l.ultim=p;
	return 0;
	}
if (pos==0)
	{
	(*p).next=l.prim;
	l.prim=p;
	return 0;
	}
if (pos==1)
	{
	(*p).next=NULL;
	(*l.ultim).next=p;
	l.ultim=p;
	return 0;
	}
return 0;
}

void scrie_err()
{
FILE *g=fopen("curcubeu.out","w");
fprintf(g,"0\n");
fcloseall();
}

void scrie()
{
long int i;
FILE *g=fopen("curcubeu.out","w");
for (i=1;i<=n-1;i++)
	fprintf(g,"%ld\n",final[i]);
fcloseall();
}

int main()
{
NODL *p;
//citire
long int i,a1,b1,c1;
FILE *f=fopen("curcubeu.in","r");
fscanf(f,"%ld%ld%ld%ld",&n,&a1,&b1,&c1);
fclose(f);
//calculeaza
culoare[1]=c1;
if (a1>b1) add(beg[b1],1,1);
else	   add(beg[a1],1,1);
if (a1>b1) add(end[a1],1,0);
else       add(end[b1],1,0);
for (i=2;i<=n-1;i++)
	{
	a1=(a1*i)%n;
	b1=(b1*i)%n;
	c1=(c1*i)%n;
	culoare[i]=c1;
	printf("%ld %ld %ld\n",a1,b1,c1);
	if (a1>b1) add(beg[b1],i,1);
	else	   add(beg[a1],i,1);
	if (a1>b1) add(end[a1],i,0);
	else       add(end[b1],i,0);
	//add(beg[min(a1,b1)],i,1);
	//add(end[max(a1,b1)],i,0);
	}
//facem swappingul
used[0]=1;
heaplen=0;
for (i=1;i<=n-1;i++)
	{
	//incarcam din cozi
	p=beg[i].prim;
	while (p)
		{
		heap[++heaplen]=(*p).inf;
		rise_heap(heaplen);
		p=(*p).next;
		}
	if (heaplen==0)
		{
		scrie_err();
		return 0;
		}
	final[i]=culoare[heap[1]];
	//descarcam stiva;
	p=end[i].prim;
	while (p)
		{
		used[(*p).inf]++;
		p=(*p).next;
		}
	while (heaplen&&used[heap[1]])
		{
		used[heap[1]]--;
		heap[1]=heap[heaplen];
		heap[heaplen]=0;
		heaplen--;
		submerge_heap(1);
		}
	}
scrie();
return 0;
}