Cod sursa(job #811544)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 12 noiembrie 2012 16:54:53
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.29 kb
#include <algorithm>
#include <fstream>
#include <vector>

using namespace std;

ifstream f("stramosi.in");
ofstream g("stramosi.out");

#define FORIT(it, v) for (typeof((v).begin()) it = (v).begin(); it != (v).end(); ++it)

const int N = 350005;
const int M = 400005;

int n, m;
int x[M], y, poz[N];
int st[N], head;
bool vis[N];
vector <int> graph[N];
vector <int> query[N];
vector <int> sol[N];

void read() {
    f >> n >> m;
    
    for (int i = 1; i <= n; ++i) {
        int a;
        f >> a;
        graph[i].push_back(a);
        graph[a].push_back(i);
    }

    for (int i = 1; i <= m; ++i) {
        f >> x[i] >> y;
        query[x[i]].push_back(y);
    }
}

void dfs(int node) {
    vis[node] = true;

    FORIT(it, query[node]) {
        if (head - *it + 1 <= 0)
            sol[node].push_back(0);
        else
            sol[node].push_back(st[head - *it + 1]);
    }
    st[++head] = node;
    FORIT(it, graph[node]) {
        if (!vis[*it])
            dfs(*it);
    }
    --head;
}

/*void dfs(int node) {
    df[++head] = node;
    while (head > 0) {
        st[++head] = df[head];
    }
}
*/
int root() {
    return 0;
}

void write() {
    for (int i = 1; i <= m; ++i) {
        g << sol[x[i]][poz[x[i]]] << "\n";
        ++poz[x[i]];
    }
}

int main() {
    read();
    dfs(root());
    write();
}