Cod sursa(job #811562)

Utilizator SchumiDumitru Andrei Georgian Schumi Data 12 noiembrie 2012 17:32:57
Problema Stramosi Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.18 kb
#include <algorithm>
#include <fstream>
#include <iostream>
#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;
int df[N], dfhead;
bool vis[N];
bool ok;
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[++dfhead] = node;

    while (dfhead > 0) {
        node = df[dfhead];
        //cerr << node << ' ';
        //if (node == 3)
        //    for (int i = 1; i <= head; ++i)
          //      cerr << st[i] << ' ';
            //cerr << "\n";
        if (!vis[node]) {
            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;
        }
        vis[node] = true;

        ok = false;
        FORIT(it, graph[node]) {
            if (!vis[*it]) {
                ok = true;
                df[++dfhead] = *it;
                break;
            }
        }
        if (!ok) {
            --dfhead;
            --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();
    //for (int i = 1; i <= n; ++i)
      //  FORIT(it, sol[i])
        //    cerr << i << "->" << *it << "\n";
}