Cod sursa(job #114263)

Utilizator mgntMarius B mgnt Data 13 decembrie 2007 17:22:35
Problema Stramosi Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.68 kb
#include <cstdio>
#include <cstdlib>
using namespace std;

int const maxn = 250000;
int const maxm = 300000;
int const maxp = 18; // 2^maxp > maxn
int v[maxn], w[2*maxm];
int a[maxp][1+maxn];
int x[maxm];

int main ()
{
  FILE * fin, * fout;
  int n, m, i, j, s, t, k;
  fin=fopen("stramosi.in","r");
  setvbuf(fin, NULL, _IOFBF, 100 * 1024);
  fscanf(fin, "%d %d\n", &n, &m);
  for(i=0;i+10<n;i+=10)
    fscanf(fin, "%d %d %d %d %d %d %d %d %d %d",
      &v[0+i], &v[1+i], &v[2+i], &v[3+i], &v[4+i],
      &v[5+i], &v[6+i], &v[7+i], &v[8+i], &v[9+i]);
  for( ;i<n;i++)
    fscanf(fin, "%d", &v[i]);
  for(i=0, m=2*m;i+10<m;i+=10)
    fscanf(fin, "%d %d %d %d %d %d %d %d %d %d",
      &w[0+i], &w[1+i], &w[2+i], &w[3+i], &w[4+i],
      &w[5+i], &w[6+i], &w[7+i], &w[8+i], &w[9+i]);
  for( ;i<m;i++)
    fscanf(fin, "%d", &w[i]);
  fclose(fin);

  a[0][0]=0;
  for(j=0;j<n;j++)
    a[0][1+j]=v[j];
  for(i=1;i<maxp;i++)
    for(j=0;j<=n;j++)
      a[i][j]=a[-1+i][a[-1+i][j]];

  for(k=0;k<m;k+=2) {
    i=w[k]; j=w[k+1];
    if(j&(1<<maxp)) {
      w[k]=0;
    } else {
      for(s=-1+maxp;s>=0;s--) {
        if(j&(t=(1<<s))) {
          j=j-t;
          i=a[s][i];
          if(0==j) {
            w[k]=i;
            break;
          }
        }
      }
    }
  }

  fout=fopen("stramosi.out", "w");
  setvbuf(fout, NULL, _IOFBF, 100 * 1024);
  for(k=0;k+20<m;k+=20)
    fprintf(fout, "%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n%d\n",
      v[ 0 + k ], v[ 2 + k ], v[ 4 + k ], v[ 6 + k ], v[ 8 + k ],
      v[10 + k ], v[12 + k ], v[14 + k ], v[16 + k ], v[18 + k ]);
  for( ;k<m;k+=2)
    fprintf(fout, "%d\n", w[k]);
  fclose(fout);

  return 0;
}