Pagini recente » Cod sursa (job #519220) | Cod sursa (job #1689638) | Cod sursa (job #2840359) | Cod sursa (job #904059) | Cod sursa (job #312546)
Cod sursa(job #312546)
#include <iostream>
#include <fstream>
#include <stdio.h>
#include <stdlib.h>
using namespace std;
#define MAXP 18
int n,m;
int q,p;
int stram[250001][MAXP];
int pows[MAXP];
#define OUTBUFFSIZE (4*1024*1024)
#define INBUFFSIZE (7*1024*1024)
char bufferout[OUTBUFFSIZE];
char bufferin[INBUFFSIZE];
char *bouti = bufferout;
char delims[] = " \t\n\r";
char *ptok;
int main() {
//time_t tStart,tEnd;//<--
//time(&tStart);
FILE *fin;
//fin.rdbuf()->pubsetbuf(bufferin,BUFFSIZE);
fin = fopen("stramosi.in","rt");
FILE *fout;
//fout.rdbuf()->pubsetbuf(bufferout,BUFFSIZE);
fout = fopen("stramosi.out","wt");
int rbytes = fread(bufferin,1,sizeof(bufferin),fin);
//printf("%d",rbytes);
if (rbytes == INBUFFSIZE)
return 1;
ptok = strtok(bufferin,delims);
n = atoi(ptok);
ptok = strtok(NULL,delims);
m = atoi(ptok);
pows[0]=1;
for (int i=1;i<MAXP;i++)
pows[i]=pows[i-1]*2;
for (int i=1;i<=n;i++) {
ptok = strtok(NULL,delims);
stram[i][0] = atoi(ptok);
}
stram[0][0]=0;
for (int i=1;i<MAXP;i++) {
for (int j=0;j<=n;j++) {
stram[j][i]=stram[stram[j][i-1]][i-1];
}
}
for (int i=0;i<m;i++) {
ptok = strtok(NULL,delims);
q = atoi(ptok);
ptok = strtok(NULL,delims);
p = atoi(ptok);
for (int pi = MAXP -1;pi>=0;pi--) {
if (p>=pows[pi]) {
p-=pows[pi];
q=stram[q][pi];
}
}
sprintf(bouti,"%d\n",q);
bouti+=strlen(bouti);
}
fprintf(fout,"%s",bufferout);
fclose(fin);
fclose(fout);
//time(&tEnd);
//cout<<"Number of ticks elapsed="<<clock()<<" TPS="<<CLOCKS_PER_SEC<<endl;
return 0;
}