Cod sursa(job #1385840)

Utilizator irimiecIrimie Catalin irimiec Data 12 martie 2015 14:41:38
Problema Arbore Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.38 kb
#include <bits/stdc++.h>

using namespace std;

#define pub push_back

void debug();

const int MAXN = 100010;
int n, m, father, found;
int st, dr;
int deg[MAXN], totsize[MAXN];
long long tree[4 * MAXN];
vector<int> sons[MAXN], linear;

void liniarise(int nod) {
    deg[nod] = 0;
    linear.pub(nod);
    totsize[nod] = sons[nod].size();

    for(auto it: sons[nod]) {
        if(deg[it])
            liniarise(it);
        totsize[nod] += totsize[it];
    }
}

void updateNod(int nod) {
    tree[nod] = max(tree[(nod << 1)], tree[(nod << 1) + 1]);
}

void treeInsert(int nod, int l, int r, int val) {
    if(l == r) {
        tree[nod] += val;
        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);

    updateNod(nod);
}

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

    if(tree[nod] < p) {
        return 0;
    }

    int mid = l + (r - l)/2;
    int asdf = 0, asdf2 = 0;

    if(st <= mid && found == -1)
        asdf = treeQuery((nod << 1), l, mid, p);
    if(mid < dr && found == -1)
        asdf2= treeQuery((nod << 1) + 1, mid + 1, r, p);

    return max(asdf, asdf2);
}

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);
        deg[y]++;
    }
    for(int i = 1; i <= n; ++i)
        if(!deg[i]) {
            father = i;
            break;
        }

    linear.pub(0);
    liniarise(father);

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

void debug() {
//    for(auto it: linear)
//        cerr << it << " ";
//    cerr << totsize[2];
    for(int i = 1; i < 16; ++i) {
        cerr << tree[i] << " ";
    }
    cerr << "\n___\n\n";
}

int main() {
    read();

    //debug();

    return 0;
}