Pagini recente » Cod sursa (job #1731576) | Cod sursa (job #101639) | Cod sursa (job #2950328) | Cod sursa (job #533860) | Cod sursa (job #2218515)
#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;
}