Cod sursa(job #312546)

Utilizator geoNechifor George geo Data 6 mai 2009 12:20:53
Problema Stramosi Scor 90
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#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;
}