Cod sursa(job #22130)

Utilizator alinaddoca alina alinad Data 25 februarie 2007 19:09:12
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.75 kb
#include<stdio.h>


FILE  *f=fopen("stramosi.in", "r"),  *g=fopen("stramosi.out", "w");


struct nod
{
 long om, nr, str, l;
 nod *urm;
};

nod *prim, *ultim;

long n, m, max;
long a[3][250001];


void insert(long x,long y, long i)
{
 nod *p, *q, *r;

 p=new nod;
 p->om=x;
 p->nr=y;
 p->str=0;
 p->l=i;
 p->urm=NULL;

 q=prim;

 while(q && q->nr<y)
  {
   r=q;
   q=q->urm;
  }

 if(q==prim)
  if(prim==NULL)
     prim=ultim=p;
  else
   {
    p->urm=prim;
    prim=p;
   }
 else
  if(r==ultim)
   {
    ultim->urm=p;
    ultim=p;
   }
  else
   {
    r->urm=p;
    p->urm=q;
   }
}



void det_stramos()
{
 int t;
 nod *p;
 p=prim;
 int d=0;
 long i, j;
 for(j=1; j<=max; j++)
  {
   while(j==p->nr)
    {
     p->str=a[1+d][p->om];
     p=p->urm;
    }
   for(i=1; i<=n && j<max; i++)
    {
     t=a[0][i];
     a[2-d][i]=a[1+d][t];
    }
   d=1-d;
  }
}


void sortare()
{
 nod *p, *q, *r;
 int ord=0;
 while(ord==0)
  {
   ord=1;
   p=prim;
   while(p)
    {
     if(p->l>p->urm->l && p->urm)
      {
       ord=0;
       q=p->urm;
       if(p==prim)
	{
	 p->urm=q->urm;
	 q->urm=p;
	 prim=q;
	}
       else
	{
	 r->urm=q;
	 p->urm=q->urm;
	 q->urm=p;
	}
      }
     r=p;
     p=p->urm;
    }
  }
}


void tipar()
{
 nod *p;
 p=prim;
 while(p)
  {
   fprintf(g, "%d\n", p->str);
   p=p->urm;
  }
 fclose(g);
}


int main()
{
 long i, x, y;
 fscanf(f, "%d%d", &n, &m);
 for(i=1; i<=n; i++)
  {
   fscanf(f, "%ld", &a[0][i]);
   a[1][i]=a[0][i];
  }
 for(i=1; i<=m; i++)
  {
   fscanf(f, "%ld%ld", &x, &y);
   if(y>max)
       max=y;
   insert(x, y, i);
  }
 fclose(f);
 det_stramos();
 sortare();
 tipar();
 fclose(g);

 return 0;

}