Cod sursa(job #63926)

Utilizator gabitzish1Gabriel Bitis gabitzish1 Data 31 mai 2007 17:31:38
Problema Stramosi Scor 20
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.19 kb
#include<stdio.h>

long long n, m, p, q;

typedef struct
{
  long long x, s1, s2, s3;
} stramos;

stramos v[400000];

long long cautare(int a, int b)
{
  long long i, rez=b;
  i=1;
  if (a-i>=4)
  for (i=1; i<=a; i+=4)
    {
      rez=v[rez].s3;
      if (rez==0) return 0;
      if (a-i<4 && a-i!=0)
      switch (a-i)
       {
	case 1: rez=v[rez].s1; break;
	case 2: rez=v[rez].s2; break;
	case 3: rez=v[rez].s3; break;
       }

    }
  else
  switch (a-i)
       {
	case 0: rez=v[rez].x ; break;
	case 1: rez=v[rez].s1; break;
	case 2: rez=v[rez].s2; break;
	case 3: rez=v[rez].s3; break;
       }
  return rez;
}

void prelucrare()
{
  for (long long i=1; i<=n; i++)
    {
      v[i].s1=v[v[i].x].x;
      v[i].s2=v[v[i].s1].x;
      v[i].s3=v[v[i].s2].x;
    }
}





int main()
{
  long long i,j, rez;
  FILE *in=fopen("stramosi.in","r");
  FILE *out=fopen("stramosi.out","w");
  fscanf(in,"%lld%lld",&n,&m);
  for (i=1; i<=n; i++)
    fscanf(in,"%lld",&v[i].x);
  prelucrare();
  for (i=1; i<=m; i++)
    {
      fscanf(in,"%lld%lld",&q,&p);
      rez=cautare(p,q);
      fprintf(out,"%lld\n",rez);
    }
  fcloseall();
  return 0;
}