Cod sursa(job #981372)

Utilizator manutrutaEmanuel Truta manutruta Data 6 august 2013 21:34:57
Problema Lowest Common Ancestor Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.41 kb
# include <iostream>
# include <fstream>
# include <vector>
# include <bitset>
# include <queue>
using namespace std;

# define MAXN 100010

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

int n, m;
int G[MAXN];
bitset<MAXN> viznod;
queue<int> coada;

void solve(int a, int b) {
    for (int i = 1; i <= n; i++) {
        viznod[i] = false;
    }

    coada.push(a);
    while (!coada.empty()) {
        int nd = coada.front();

        //cout << nd << ' ';

        coada.pop();
        viznod[nd] = true;
        if (G[nd] != 0) {
            coada.push(G[nd]);
        }
    }
    //cout << endl;

    /*for (int i = 1; i <= n; i++) {
        cout << viznod[i] << ' ';
    }
    cout << endl;*/

    if (viznod[b] == true) {
        g << b << '\n';
    } else {
        coada.push(b);
    }
    while (!coada.empty()) {
        int nd = coada.front();
        coada.pop();

        if (viznod[G[nd]] == true) {
            g << G[nd] << '\n';
            break;
        }

        coada.push(G[nd]);
    }
}

int main()
{
    f >> n >> m;
    for (int i = 2; i <= n; i++) {
        int x;
        f >> x;
        G[i] = x;
    }

    /*for (int i = 1; i <= n; i++) {
        cout << G[i] << ' ';
    }
    cout << endl;*/

    for (int i = 1; i <= m; i++) {
        int a, b;
        f >> a >> b;
        solve(a, b);
    }

    //solve(4, 2);

    return 0;
}