Cod sursa(job #65267)

Utilizator eddieOlariu Eduard Iuliu eddie Data 8 iunie 2007 09:03:42
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.99 kb
#include <stdio.h>
#include <math.h>
long int n,m,p[101][40];
long int xx[301],dh;
void constr_heap();
void recon_heap();
int putere_2(long int x)
 {
  long int p=1;
  long int k=0;
  if (x==1)
     return 0;
  do
   {
    p*=2;
    k++;
   }
  while (p<x);
  return --k;
 }
void recon_heap(int a[101],int i)
 {
  int l=2*i,r;
  r=l+1;
  int max;
  if ((l<=dh)&&(a[l]>a[i]))
     max=l;
    else
     max=i;
  if ((r<=dh)&&(a[r]>a[max]))
     max=r;
  if (max!=i)
     {
      a[0]=a[i];
      a[i]=a[max];
      a[max]=a[0];
      recon_heap(a,max);
     }
 }
void constr_heap(int a[101])
 {
  dh=n;
  int i;
  for (i=n/2;i>=1;i--)
      recon_heap(a,i);
 }
void heapsort(int a[101])
 {
  int i;
  for (i=n;i>=2;i--)
      {
       a[0]=a[i];
       a[i]=a[1];
       a[1]=a[0];
       dh--;
       recon_heap(a,1);
      }
 }
int main()
 {
  freopen ("stramosi.in","r",stdin);
  freopen ("stramosi.out","w",stdout);
  scanf ("%ld %ld",&n,&m);
  register long i;
  long int kk=0;
  int a[101];
  for (i=1;i<=n;i++)
      {
       scanf ("%ld",&a[i]);
      }
  constr_heap(a);
  heapsort(a);
  for (i=1;i<=n;i++)
      {
       p[i][0]=a[i];
       if (a[i]==0)
	  xx[++kk]=i;
   //    printf("%ld ",p[i][0]);
/*       if (h==0)
	  p[i][0]=h;*/
       register long int j;
       if (a[i]!=0)
       for (j=1;p[p[i][j-1]][j-1]!=0;j++)
	   {
	     p[i][j]=p[p[i][j-1]][j-1];
     //	     printf("%ld ",p[i][j]);
	   }
      // printf("\n");
      }
  for (i=1;i<=kk;i++)
     {
      p[xx[i]][0]=xx[i];
   //   printf("%ld     ",xx[i]);
     }
  long q,l;
//  printf("\n\n");
  for (i=1;i<=m;i++)
      {
       scanf("%ld %ld",&q,&l);
/*       if (q==q)
	  {*/
	   p[0][0]=putere_2(l);
	   l-=pow(2,p[0][0]);
	  //}
       while ((p[q][p[0][0]]!=0)&&(l!=0)&&(p[q][p[0][0]]!=q))
	{
	 q=p[q][p[0][0]];
	 p[0][0]=putere_2(l);
	 l-=pow(2,p[0][0]);
	}
       printf("%ld\n",p[q][p[0][0]]);
      }
  fclose(stdout);
  return 0;
 }