Cod sursa(job #1386100)

Utilizator irimiecIrimie Catalin irimiec Data 12 martie 2015 18:13:47
Problema Arbore Scor 5
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.44 kb
#include <bits/stdc++.h>

using namespace std;

#define pub push_back
#define fs first
#define sc second

void debug();

const int MAXN = 100010;
int n, m, found;
int st, dr, ordPos = 0;
int deg[MAXN], linear[MAXN];
int tree[8 * MAXN], treeMax[8 * MAXN];
vector<int> sons[MAXN];
pair<int, int> ord[MAXN];

void liniarise(int nod, int fn) {
    deg[nod] = 1;
    ord[nod].fs = ++ordPos;
    linear[ordPos] = nod;

    for(auto it: sons[nod]) {
        if(!deg[it] && it != fn)
            liniarise(it, nod);
    }

    ord[nod].sc = ordPos;
}

void treeInsert(int nod, int l, int r, int val) {
    if(st <= l && r <= dr) {
        tree[nod] += val;
        treeMax[nod] = tree[nod] + max(tree[(nod<<1)], tree[(nod<<1)+1]);
        return;
    }

    int mid = l + (r - l)/2;

    if(st <= mid)
        treeInsert( (nod << 1), l, mid, val);
    if(mid < dr)
        treeInsert( (nod << 1) + 1, mid + 1, r, val);

    treeMax[nod] = tree[nod] + max(treeMax[(nod << 1)], treeMax[(nod << 1) + 1]);
}

void treeQuery(int nod, int l, int r, int p) {
    if(found > 0)
        return;
    if(tree[nod] == p) {
        found = linear[l];
        return;
    }

    if(l < r && treeMax[nod] >= p && tree[nod] < p) {
        int mid = l + (r - l)/2;
        treeQuery((nod << 1), l, mid, p - tree[nod]);
        treeQuery((nod << 1) + 1, mid + 1, r, p - tree[nod]);
    }
}

void read() {
    freopen("arbore.in", "r", stdin);
    freopen("arbore.out", "w", stdout);

    int x, y;
    int t, p, s;

    scanf("%d%d", &n, &m);
    for(int i = 1; i < n; ++i) {
        scanf("%d%d", &x, &y);
        sons[x].pub(y);
        sons[y].pub(x);
    }

    liniarise(1, 0);

    for(int i = 0; i < m; ++i) {
        scanf("%d%d", &t, &p);
        if(t == 1) {
            scanf("%d", &s);
            st = ord[p].fs, dr = ord[p].sc;
            treeInsert(1, 1, ordPos, s);
        } else {
            st = 1, dr = n; found = -1;
            treeQuery(1, 1, ordPos, p);
            printf("%d\n", found);
        }
    }
}

void debug() {
//    for(int i = 1; i <= n; ++i)
//        cerr << linear[i] << " ";
//    cerr << "\n";
//    for(int i = 1; i <= n; ++i) {
//        cerr << i << ": (" << ord[i].fs << ", " << ord[i].sc << ");\n";
//    }
    for(int i = 1; i < 16; ++i) {
        cerr << tree[i] << " ";
    }
    cerr << "\n___\n\n";
}

int main() {
    read();

//    debug();

    return 0;
}