Cod sursa(job #80830)

Utilizator alex23alexandru andronache alex23 Data 30 august 2007 11:42:22
Problema Stramosi Scor 60
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.76 kb
#include <stdio.h>


struct aa{
int poz,nr,initial;
};

aa b[300002];
int c[300000],q;


void QuickSort(int left,int right)
   {int l_hold, r_hold;
    aa pivot;

       l_hold=left;
       r_hold=right;
       pivot.poz=b[left].poz;
       pivot.nr=b[left].nr;
       pivot.initial=b[left].initial;
       while (left < right)
	   {
	     while ((b[right].nr>=pivot.nr) && (left < right))
		    right--;
		if (left != right)
		{
		    b[left].poz=b[right].poz;
		    b[left].nr=b[right].nr;
		    b[left].initial=b[right].initial;
		    left++;
		}
	      while ((b[left].nr<=pivot.nr) && (left < right))
		    left++;
		if (left != right)
		{
		    b[right].poz=b[left].poz;
		    b[right].nr=b[left].nr;
		    b[right].initial=b[left].initial;
		    right--;
		}
	    }
	 b[left].poz = pivot.poz;
	 b[left].nr=pivot.nr;
	 b[left].initial=pivot.initial;
	 pivot.nr = left;
	 left = l_hold;
	 right = r_hold;
	 if (left < pivot.nr)
		QuickSort(left,pivot.nr - 1);
	 if (right > pivot.nr)
		QuickSort(pivot.nr + 1,right);
     }



void QuickSort1(int left,int right)
   {int l_hold, r_hold;
    aa pivot;

       l_hold = left;
       r_hold = right;
       pivot.poz=b[left].poz;
       pivot.nr=b[left].nr;
       pivot.initial=b[left].initial;

       while (left < right)
	   {
	     while ((b[right].initial >= pivot.initial) && (left < right))
		    right--;
		if (left != right)
		{
		    b[left].nr = b[right].nr;
		    b[left].initial=b[right].initial;
		    b[left].poz=b[right].poz;
		    left++;
		}
	      while ((b[left].initial <= pivot.initial) && (left < right))
		    left++;
		if (left != right)
		{
		    b[right].nr = b[left].nr;
		    b[right].initial=b[left].initial;
		    b[right].poz=b[left].poz;
		    right--;
		}
	    }
	 b[left].initial = pivot.initial;
	 b[left].nr=pivot.nr;
	 b[left].poz=pivot.poz;
	 pivot.initial = left;
	 left = l_hold;
	 right = r_hold;
	 if (left < pivot.initial)
		QuickSort1(left,pivot.initial - 1);
	 if (right > pivot.initial)
		QuickSort1(pivot.initial + 1,right);
     }






int main()
{FILE *fin,*fout;
int n,m,a[300000],i,j,k,p;


fin=fopen("stramosi.in","r");
fout=fopen("stramosi.out","w");

fscanf(fin,"%d %d",&n,&m);
for (i=1;i<=n;i++)
   fscanf(fin,"%d",&a[i]);
a[0]=0;
for (i=1;i<=m;i++)
   {fscanf(fin,"%d %d",&b[i].poz,&b[i].nr);
    b[i].initial=i;
    }
QuickSort(1,m);

for (i=1;i<=n;i++)
   c[i]=a[i];


q=1;
for (k=1;k<=b[m].nr;k++)
   {

    while ((q<=m)&&(b[q].nr==k))
	 {b[q].poz=c[b[q].poz];
	  q++;
	  }
    for (i=1;i<=n;i++)
      c[i]=a[c[i]];
    //for (i=1;i<=n;i++)
      //a[i]=c[i];
    }

QuickSort1(1,m);

for (i=1;i<=m;i++)
   fprintf(fout,"%d\n",b[i].poz);

fclose(fin);
fclose(fout);
}