Cod sursa(job #2218515)

Utilizator NOSCOPEPROKENDYMACHEAMACUMVREAU NOSCOPEPROKENDY Data 4 iulie 2018 18:22:26
Problema Arbore Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.12 kb
#include <bits/stdc++.h>
using namespace std;

int n, m, r, nr, NR;
int id[100005];
int w[100005], Max[100005];
vector <int> v[100005];
inline void dfs(int nod){
    w[nod] = ++NR;
    for(auto it : v[nod]){
        if(w[it]) continue ;
        dfs(it);
    }
    Max[nod] = NR;
}

int a[100005], Lazy[100005], st[100005], dr[100005];
bitset <1000001> f[318];
inline void build(int p, int l, int r, int val){
    for(int i = st[p]; i <= dr[p] ; ++i) f[p][a[i]] = 0;
    for(int i = st[p]; i <= dr[p] ; ++i) {
        if(i >= l && i <= r) a[i] += val;
        f[p][a[i]] = 1;
    }
}
inline void update(int nod, int val){
    int p = w[nod] / r;
    if(w[nod] % r) ++p;
    int right = Max[nod];
    int p2 = right / r;
    if(right % r) ++p2;
    if(p == p2) build(p, w[nod], right, val);
    else{
        if(w[nod] != st[p]){
            build(p, w[nod], dr[p], val);
            ++p;
        }
        if(right != dr[p2] && p2 >= p){
            build(p2, st[p2], right, val);
            --p2;
        }
        for(int i = p; i <= p2 ; ++i) Lazy[i] += val;
    }
}
inline int query(int s){
    for(int i = 1; i <= nr ; ++i){
        if(Lazy[i] > s) continue ;
        if(f[i][s - Lazy[i]]){
            for(int j = st[i]; j <= dr[i] ; ++j)
                if(a[j] == s - Lazy[i]) return id[j];
        }
    }
    return -1;
}
int main()
{
    freopen("arbore.in", "r", stdin);
    freopen("arbore.out", "w", stdout);

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

    dfs(1);
    for(int i = 1; i <= n ; ++i) id[w[i]] = i;
    r = sqrt(n);
    nr = 0;
    for(int i = 1; i <= n ; i += r){
        f[++nr][0] = 1;
        st[nr] = i;
        dr[nr] = min(i + r - 1, n);
    }

    int t, s;
    for(int i = 1; i <= m ; ++i){
        scanf("%d", &t);
        if(t == 1){
            scanf("%d%d", &x, &s);
            update(x, s);
        }
        else{
            scanf("%d", &s);
            printf("%d\n", query(s));
        }
    }
    return 0;
}