Cod sursa(job #1388993)

Utilizator tudoras8tudoras8 tudoras8 Data 15 martie 2015 21:09:15
Problema Stramosi Scor 80
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.36 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <map>
#include <unordered_map>

using namespace std;

const int MAXN = 250010, MAXM = 300010;

int N, M;
int st[MAXN];
vector<int> adj[MAXN], vf;
vector<bool> viz(MAXN, 0);

struct pairhash {
public:
  template <typename T, typename U>
  std::size_t operator()(const std::pair<T, U> &x) const
  {
    return std::hash<T>()(x.first) ^ std::hash<U>()(x.second);
  }
};

unordered_map<int, vector<int>> dp;

unordered_map<int, pair<int, int> > query;
map<pair<int, int>, int> sol;

void dfs(int u, int nivel = 0) {
    st[nivel] = u;
    viz[u] = true;

    if (dp.find(u) != dp.end()) {
        for (int a : dp[u]) {
            sol[make_pair(u, a)] = st[nivel - a];
        }
    }

    for (int v : adj[u]) {
        if (!viz[v]) {
            dfs(v, nivel + 1);
        }
    }
}

int main()
{
    int t, Q, P;

    ifstream f("stramosi.in");
    freopen("stramosi.out", "w", stdout);
    f >> N >> M;

    for (int i = 1; i <= N; i++) {
        f >> t;

        if (t == 0) vf.push_back(i);
        else adj[t].push_back(i);
    }

    for (int i = 0; i < M; i++) {
        f >> P >> Q;
        dp[P].push_back(Q);
        query[i + 1] = make_pair(P, Q);
    }

    for (int x : vf) {
        dfs(x);
    }

    for (int i = 1; i <= M; i++) {
        cout << sol[query[i]] << '\n';
    }

    f.close();
    return 0;
}