Pagini recente » Cod sursa (job #982315) | Cod sursa (job #638260) | Cod sursa (job #1721602) | Cod sursa (job #2726473) | Cod sursa (job #2923417)
#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;
}