Cod sursa(job #2923417)

Utilizator Cosmin2004_InfoMoldoveanu Cosmin Cosmin2004_Info Data 13 septembrie 2022 16:31:13
Problema Arbore Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 1.98 kb
#include <bits/stdc++.h>

using namespace std;
const int BS = 400;
const int N = 1e5 + BS;
int n, m, v[N], timer, tin[N], tout[N];
int add[N / BS + 5], rev[N];
vector <int> g[N];
bitset <1000005> b[N / BS + 5];
void dfs(int u, int p)
{
    tin[u] = ++timer;
    rev[timer] = u;
    for(int v : g[u]) if(v != p)
        dfs(v, u);
    tout[u] = timer;
}

void update_bucket(int bn, int l, int r, int val)
{
    for(int i = l; i <= r; i++)
        b[bn][v[i]] = 0;
    for(int i = l; i <= r; i++)
        b[bn][v[i] += val] = 1;
    for(int i = bn * BS; i < l; i++)
        b[bn][v[i]] = 1;
    for(int i = r + 1; i < (bn + 1) * BS; i++)
        b[bn][v[i]] = 1;
}

void update_segment(int l, int r, int val)
{
    if(l > r) return;
    int bl = l / BS, br = r / BS;
    for(int i = bl + 1; i < br; i++)
        add[i] += val;
    if(bl == br) update_bucket(bl, l, r, val);
    else update_bucket(bl, l, bl * BS + BS - 1, val),
            update_bucket(br, br * BS, r, val);
}

void update(int p, int s)
{
    update_segment(tin[p], tout[p], s);
}

int query(int s)
{
    int res = -1;
    for(int bn = 0; bn <= n / BS && res == -1; bn++)
        if(s >= add[bn] && b[bn][s - add[bn]]) {
            for(int i = bn * BS; i < (bn + 1) * BS; i++)
                if(v[i] == s - add[bn]) {
                    res = i;
                    break;
                }
        }
    return rev[res];
}

int main()
{
    ifstream cin("arbore.in");
    ofstream cout("arbore.out");
    cin >> n >> m;
    for(int i = 1, u, v; i < n; i++)
        cin >> u >> v,
        g[u].push_back(v),
        g[v].push_back(u);
    dfs(1, 0);
    for(int bn = 0; bn <= n / BS; bn++)
        b[bn][0] = 1;
    for(int i = 1; i <= m; i++) {
        int type, p, s;
        cin >> type;
        if(type == 1) {
            cin >> p >> s;
            update(p, s);
        } else {
            cin >> s;
            cout << query(s) << "\n";
        }
    }
    return 0;
}