Cod sursa(job #879431)

Utilizator cont_de_testeCont Teste cont_de_teste Data 15 februarie 2013 13:47:03
Problema Arbore Scor 100
Compilator cpp Status done
Runda Lista lui wefgef Marime 2.39 kb
# include <algorithm>
#include <cstdio>
#include <vector>
#include <cassert>
#define MAXN 100005
#define ARBSIZE 262145

using namespace std;

int n, m, vec[MAXN], ep, ST[MAXN], DR[MAXN], x, y;
bool viz[MAXN];
bool found;

int maxi[MAXN << 2], inc[MAXN << 2];

vector<int> G[MAXN];

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 left, int right, int x, int y)
{
    if (ST[x] <= left && right <= DR[x])
        inc[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);
    }

        maxi[node] = max(maxi[node << 1], maxi[(node << 1) | 1]) + inc[node];
}

int query(int node, int left, int right, int x)
{
    int ll = 0;
   ;

    if ( (x -= inc[node]) == 0)
    {
        printf("%d\n", vec[left]);
        return 1;
    }
    if (left != right && x > 0 && maxi[node] - inc[node] >= x)
    {
        int mid = (left + right) >> 1;

        if ((ll = query(node << 1, left, mid, x)) == 0)
            ll = query((node << 1) | 1, mid + 1, right, x);
    }

    x += inc[node];
    return ll;
}

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 i = 1 ; i <= m ; ++i)
    {
        int command;
        assert (scanf("%d %d", &command, &x) == 2);
        if (command == 1)
        {
            assert (scanf("%d", &y) == 1);
            update(1, 1, n, x, y);
        }
        else
        {



            if (!query(1, 1, n, x))
                printf("%d\n", -1);
        }
    }

    return 0;
}