Pagini recente » Cod sursa (job #1654941) | Cod sursa (job #193333) | Cod sursa (job #2596545) | Cod sursa (job #1324712) | Cod sursa (job #1729536)
#include <iostream>
#include <fstream>
using namespace std;
#define NMAX 250000
#define MMAX 300000
#define PMAX 18
//#define _DEBUG
int N, M, PMax = 0;
int Q[MMAX];
int P[MMAX];
int R[MMAX];
int stramosi[NMAX+1][PMAX+1];
inline int readInt(string& s, int& index) {
int i = 0;
while (index < s.length()) {
int ch = s[index];
if (ch != ' ')
break;
index++;
}
while (index < s.length()) {
int ch = s[index++];
if (ch >= '0' && ch <= '9')
i = i * 10 + ch - '0';
else
break;
}
return i;
}
int main(int argc, const char * argv[]) {
int i, j;
ifstream fin("stramosi.in", ios::in);
string line;
int index = 0;
getline(fin, line);
N = readInt(line, index);
M = readInt(line, index);
getline(fin, line);
index = 0;
for (i = 1; i <= N; i++)
stramosi[i][0] = readInt(line, index);
for (i = 0; i < M; i++) {
getline(fin, line);
index = 0;
Q[i] = readInt(line, index);
P[i] = readInt(line, index);
if (P[i] > PMax)
PMax = P[i];
}
fin.close();
for (i = 1, j = 0; i < PMax; i <<= 1, j++);
PMax = j - 1;
if (PMax > PMAX)
PMax = PMAX;
for (j = 1; j <= PMax; j++) {
for (i = 1; i <= N; i++) {
int s = stramosi[i][j-1];
if (s != 0)
s = stramosi[s][j-1];
stramosi[i][j] = s;
}
}
for (i = 0; i < M; i++) {
int p = P[i];
int q = Q[i];
for (int k = PMax; k >= 0 && p != 0 && q != 0; k--) {
int bit = 1 << k;
if ((p & bit) != 0) {
q = stramosi[q][k];
p &= ~bit;
}
}
R[i] = q;
}
#ifdef _DEBUG
for (int i = 0; i < M; i++)
cout << R[i] << "\n";
#else
fstream fout("stramosi.out", fstream::out);
for (int i = 0; i < M; i++)
fout << R[i] << "\n";
fout.close();
#endif
return 0;
}