Pagini recente » Cod sursa (job #2248742) | Cod sursa (job #653) | Cod sursa (job #1555352) | Cod sursa (job #864728) | Cod sursa (job #312562)
Cod sursa(job #312562)
#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+1];
#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");
if (fin == NULL)
fprintf(stderr,"stramosi.in open error\n");
if (fout == NULL)
fprintf(stderr,"stramosi.out open error\n");
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+1;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;pows[i]<n;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);
if (p>=n) {
sprintf(bouti,"0\n");
bouti+=strlen(bouti);
continue;
}
//fprintf(stderr,"p=%d\n",p);
for (int pi = 0;pows[pi]<=p;pi++) {
if ((p & pows[pi]) != 0) {
//fprintf(stderr,"t=%d\n",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;
}