Pagini recente » Cod sursa (job #395587) | Cod sursa (job #331101) | Cod sursa (job #974440) | Cod sursa (job #1843694) | Cod sursa (job #3316802)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
int n, q, i, a[100002], galmar, bat[100002], add[100002];
unordered_map<int, int> fr[100002];
vector<int> gr[100002];
int moment, timp[2][100002];
static inline void Dfs(int nod = 1, int tata = 0) {
a[++moment] = nod;
timp[0][nod] = moment;
for(int urm : gr[nod]) {
if(urm != tata) Dfs(urm, nod);
}
timp[1][nod] = moment;
}
static inline void Update(int st, int dr, int val) {
int bst = st / galmar;
int bdr = dr / galmar;
for(int i = bst; i <= bdr; i++) {
int lst = galmar * i;
int ldr = galmar * (i + 1) - 1;
if(st <= lst && ldr <= dr) bat[i] += val;
else {
lst = max(lst, st);
ldr = min(ldr, dr);
for(int j = lst; j <= ldr; j++) {
fr[i][add[j]]--;
if(fr[i][add[j]] <= 0) fr[i].erase(add[j]);
add[j] += val;
fr[i][add[j]]++;
}
}
}
}
static inline int Query(int sum) {
for(int i = 0; i < galmar + 2; i++) {
if(fr[i].find(sum - bat[i]) != fr[i].end()){
int st = galmar * i;
int dr = galmar * (i + 1) - 1;
for(int j = st; j <= dr; j++) {
if(add[j] + bat[i] == sum) return a[j];
}
}
}
return -1;
}
int main() {
fin.tie(NULL);
fout.tie(NULL);
fin >> n >> q;
for(i = 1; i < n; i++) {
int x, y;
fin >> x >> y;
gr[x].push_back(y);
gr[y].push_back(x);
}
galmar = n / sqrt(n);
Dfs();
for(i = 0; i < n; i++) fr[i / galmar].insert({0, 1});
while(q--) {
int op, x;
fin >> op >> x;
if(op == 1) {
int y;
fin >> y;
Update(timp[0][x], timp[1][x], y);
}
else fout << Query(x) << "\n";
}
return 0;
}