Cod sursa(job #1786685)

Utilizator andrei_diaconu11Andrei C. Diaconu andrei_diaconu11 Data 23 octombrie 2016 14:37:49
Problema Stramosi Scor 70
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.48 kb
#include <stdio.h>
#include <ctype.h>
#define MAX_N 250000
#define LIM 1<<7
using namespace std;
int v[MAX_N+2][19];
FILE *fi, *fo;
int poz=LIM, poz2=0;
char BUF[LIM], BUF2[LIM];

inline char getChar(){
  poz++;
  if(poz>=LIM){
    fread(BUF,LIM,1,fi);
    poz=0;
  }
  return BUF[poz];
}

inline int getNr(){
  int r=0, semn=1;
  char ch=getChar();
  while(isdigit(ch)==0 && ch!='-') ch=getChar();
  if(ch=='-'){
    semn=-1;
    ch=getChar();
  }
  while(isdigit(ch)!=0){
    r=r*10+semn*(ch-'0');
    ch=getChar();
  }
  return r;
}

inline void putch(char ch){
  BUF2[poz2++]=ch;
  if(poz2==LIM){
    fwrite(BUF2,LIM,1,fo);
    poz2=0;
  }
}

inline void baga(int x){
  char s[15];
  int k=0;
  if(x<0){
    putch('0');
    return;
  }
  do{
    s[k++]=x%10+'0';
    x/=10;
  }while(x);
  while(k>0){
    k--;
    putch(s[k]);
  }
}

int main()
{
  int n, m, i, j, pe, a, nr, p;
  fi=fopen("stramosi.in", "r");
  fo=fopen("stramosi.out", "w");
  n=getNr();
  m=getNr();
  for(i=1;i<=n;i++)
    v[i][0]=getNr();
  for(i=1;i<=n;i++){
    pe=1;
    a=i;
    j=0;
    do{
      j++;
      a=v[a][0];
      if(j==1<<pe){
        v[i][pe]=a;
        pe++;
      }
    }while(a!=0);
  }
  for(j=0;j<m;j++){
    a=getNr();
    nr=getNr();
    pe=0;
    p=1;
    while(p<=nr){
      p*=2;
      pe++;
    }
    for(pe--;pe>=0;pe--)
      if(1<<pe<=nr){
        a=v[a][pe];
        nr-=(1<<pe);
      }
    baga(a);
    putch('\n');
  }
  if(poz2>0)
    fwrite(BUF2,poz2,1,fo);
  fclose(fi);
  fclose(fo);
  return 0;
}