Cod sursa(job #879442)

Utilizator cont_de_testeCont Teste cont_de_teste Data 15 februarie 2013 14:00:30
Problema Arbore Scor 65
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.61 kb
# include <algorithm>
# include <cassert>
# include <cstdio>
# include <cmath>
# include <vector>
using namespace std;

const int MAX = 100005;
bool viz[MAX];
int m, n, ST[MAX], DR[MAX], vec[MAX], cnt[MAX << 2], ai[MAX << 2];
vector <int> G[MAX];

void dfs (int node) {
    vec[++vec[0]] = node, ST[node] = vec[0];
    viz[node] = 1;
    for (vector <int> :: iterator it = G[node].begin (); it != G[node].end (); ++it)
        if (viz[*it] == 0)
            dfs (*it);
    DR[node] = vec[0];
}

/*void dfs(int node)
{
    vec[++ep] = node;
    ST[node] = ep;

    viz[node] = 1;
    int len = G[node].size();
    for (int i = 0 ; i < len ; ++i)
        if (viz[G[node][i]] == 0)
            dfs(G[node][i]);

    DR[node] = ep;
}*/
void update (int node, int st, int dr, int l, int val) {
    if (ST[l] <= st && dr <= DR[l]) {
        cnt[node] += val;
    } else {
        int mij = (st + dr) >> 1;
        if (ST[l] <= mij) update (node << 1, st, mij, l, val);
        if (mij < DR[l]) update ((node << 1) | 1, mij + 1, dr, l, val);
    }
    ai[node] = cnt[node] + max (ai[node << 1], ai[(node << 1) | 1]);
}
/*void update(int node, int left, int right, int x, int y)
{
    if (ST[x] <= left && right <= DR[x])
        cnt[node] += y;
    else
    {
        int mid = (left + right) >> 1;
        if (ST[x] <= mid)
            update(node << 1, left, mid, x, y);
        if (DR[x] > mid)
            update((node << 1) | 1, mid + 1, right, x, y);
    }

        ai[node] = max(ai[node << 1], ai[(node << 1) | 1]) + cnt[node];
}*/

int query (int node, int st, int dr, int l) {
    if ((l -= cnt[node]) == 0) {
        printf ("%d\n", vec[st]);
        return 1;
    }
    int value = 0;
    if (st != dr && l > 0 && ai[node] - cnt[node] >= l) {
        int mij = (st + dr) >> 1;
        if ((value = query (node << 1, st, mij, l)) == 0)
            value = query ((node << 1) | 1, mij + 1, dr, l);
    }
    l += cnt[node];
    return value;
}

int main()
{
    assert (freopen("arbore.in", "r", stdin));
    assert (freopen("arbore.out","w",stdout));

    assert (scanf("%d %d", &n, &m) == 2);

    for (int i = 1 ; i < n ; ++i)
    {
        int a, b;
        assert (scanf("%d %d", &a, &b) == 2);
        G[a].push_back(b);
        G[b].push_back(a);
    }

    dfs(1);

    for (int what, p, s; m; --m) {
        scanf ("%d %d", &what, &p);
        if (what == 1) {
            scanf ("%d", &s) == 1;
            update (1, 1, n, p, s);
        } else {
            if (query (1, 1, n, p) == 0)
                printf ("-1\n");
        }
    }

    return 0;
}