Pagini recente » Cod sursa (job #553128) | Cod sursa (job #2449248) | Cod sursa (job #1076404) | Cod sursa (job #1291013) | Cod sursa (job #1930115)
#include <stdio.h>
#include <vector>
#include <assert.h>
#include <ctype.h>
using std::vector;
#define MAX_M 300000
#define MAX_N 250000
#define MAX_BUFF 65536
typedef struct {
int v, next;
} list;
typedef struct {
int pos, init, next;
} cell;
vector <int> root;
int N, M, buff, ptr;
int adj[MAX_N + 1], fix[MAX_N + 1];
list l[MAX_N + 1];
cell maintain[MAX_M + 1];
int ss, stack[MAX_N + 1];
int answer[MAX_M + 1];
char in[MAX_BUFF];
int pos = MAX_BUFF;
char getChar(FILE *f) {
if (pos == MAX_BUFF) {
fread(in, 1, MAX_BUFF, f);
pos = 0;
}
return in[pos++];
}
int freef(FILE *f) {
int result = 0;
char c;
do {
c = getChar(f);
} while (!isdigit(c));
do {
result = (result << 3) + (result << 1) + c - '0';
c = getChar(f);
} while (isdigit(c));
return result;
}
void addEdge(int u, int v) {
buff++;
l[buff].v = v;
l[buff].next = adj[u];
adj[u] = buff;
}
void push(int u, int pos, int init) {
ptr++;
maintain[ptr].pos = pos;
maintain[ptr].init = init;
maintain[ptr].next = fix[u];
fix[u] = ptr;
}
void dfs(int u) {
int pos, it, v;
stack[ss++] = u;
for (pos = adj[u]; pos; pos = l[pos].next) {
v = l[pos].v;
dfs(v);
}
ss--;
for (it = fix[u]; it; it = maintain[it].next) {
answer[maintain[it].init] = (ss >= maintain[it].pos) ? stack[ss - maintain[it].pos] : 0;
}
}
int main(void) {
int i, u, pos;
FILE *f = fopen("stramosi.in", "r");
N = freef(f);
M = freef(f);
for (i = 1; i <= N; i++) {
u = freef(f);
if (u) {
addEdge(u, i);
} else {
root.push_back(i);
}
}
for (i = 1; i <= M; i++) {
u = freef(f);
pos = freef(f);
push(u, pos, i);
}
fclose(f);
for (i = 0; i < root.size(); i++) {
dfs(root[i]);
}
freopen("stramosi.out", "w", stdout);
for (i = 1; i <= M; i++) {
fprintf(stdout, "%d\n", answer[i]);
}
fclose(stdout);
return 0;
}