Cod sursa(job #1989851)

Utilizator Kln1000Ciobanu Bogdan Kln1000 Data 9 iunie 2017 09:49:50
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.16 kb
#include <iostream>
#include <vector>
#include <fstream>
#include <queue>
#include <bitset>

#define MAXN 100010

using namespace std;

ifstream f ("arbore.in");
ofstream t ("arbore.out");

int suma,n,m,s[MAXN];
vector <int> bani[0x10000F],v[MAXN];

void bfs(int nod){
    bitset <MAXN> vaz;
    queue <int> q;
    vaz[nod]=true;
    q.push(nod);
    while (!q.empty()){
        int current=q.front();
        s[current]+=suma;
        bani[s[current]].push_back(current);
        q.pop();
        for (auto i:v[current])
            if (!vaz[i])
                q.push(i),
                vaz[i]=true;
    }
}

int query(int val){
    vector <int>::iterator it=bani[val].begin();
    while (s[*it]!=val and it!=bani[val].end())
        ++it;
    if (it!=bani[val].end())
        return *it;
    else
        return -1;
}

int main()
{
    f>>n>>m;
    for (int a,b,i=1;i<n;++i)
        f>>a>>b,
        v[a].push_back(b);
    for (int type,a,i=0;i<m;++i){
        f>>type;
        if (type==1)
            f>>a>>suma,
            bfs(a);
        else
            f>>a,
            t<<query(a)<<'\n';
    }
    return 0;
}