Pagini recente » Cod sursa (job #760415) | Cod sursa (job #1688563) | Cod sursa (job #40734) | Cod sursa (job #2511895) | Cod sursa (job #2923185)
#include <bits/stdc++.h>
using namespace std;
ifstream in("arbore.in");
ofstream out("arbore.out");
const int XD = 400;
int n, q, x, y;
int timer;
vector <int> g[100005];
int fst[100005], lst[100005];
int add[XD], nr[200005], v[200005];
bitset <1000005> f[100005 / XD + 1];
void dfs(int nod, int tata = 0) {
fst[nod] = ++timer;
for(auto &fiu : g[nod]) {
if(fiu == tata)
continue;
dfs(fiu, nod);
}
lst[nod] = ++timer;
nr[fst[nod]] = nr[lst[nod]] = nod;
}
int main() {
in >> n >> q;
for(int i = 1; i < n; i++) {
in >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1);
for(int i = 0; i <= n / XD; i++)
f[i][0] = 1;
for(; q; q--) {
int t;
in >> t >> x;
if(t == 1) {
in >> y;
int l = fst[x], r = lst[x];
int gl = l / XD, gr = r / XD;
if(gl == gr) {
for(int i = gl * XD; i < (gl + 1) * XD; i++) {
f[gl][v[i]] = 0;
}
for(int i = l; i <= r; i++) {
v[i] += y;
}
for(int i = gl * XD; i < (gl + 1) * XD; i++) {
f[gl][v[i]] = 1;
}
continue;
}
for(int i = gl * XD; i < (gl + 1) * XD; i++) {
f[gl][v[i]] = 0;
}
for(int i = l; i < (gl + 1) * XD; i++) {
v[i] += y;
}
for(int i = gl * XD; i < (gl + 1) * XD; i++) {
f[gl][v[i]] = 1;
}
for(int i = gl; i < gr; i++) {
add[i] += y;
}
for(int i = gr * XD; i < (gr + 1) * XD; i++) {
f[gr][v[i]] = 0;
}
for(int i = gr * XD; i <= r; i++) {
v[i] += y;
}
for(int i = gr * XD; i < (gr + 1) * XD; i++) {
f[gr][v[i]] = 1;
}
} else {
int lol = -1;
for(int i = 0; i <= n / XD; i++) {
if(add[i] > x)
continue;
if(f[i][x - add[i]]) {
for(int j = i * XD; j < (i + 1) * XD; j++) {
if(v[j] == x - add[i] && j) {
lol = j;
break;
}
}
break;
}
}
out << (lol != -1 ? nr[lol] : lol) << "\n";
}
}
return 0;
}