Pagini recente » Cod sursa (job #2050380) | Cod sursa (job #770934) | Cod sursa (job #3157784) | Cod sursa (job #2121276) | Cod sursa (job #1557000)
#include <cstdio>
#include <algorithm>
using namespace std;
#define BSIZE 180
#define MAXN 100005
#define MAXB 1005
int Block[MAXN], Node[MAXN], Val[MAXN], B[MAXN], E[MAXN], Sort[MAXN];
int Start[MAXB], End[MAXB], Sum[MAXB];
bool Updated[MAXN];
int G[MAXN], Vec[2*MAXN], Next[2*MAXN];
int edges;
int timer = 0, blocks;
void dfs(int node) {
B[node] = ++timer;
Node[timer] = node;
for(int p = G[node]; p; p = Next[p])
if(!B[Vec[p]])
dfs(Vec[p]);
E[node] = timer;
}
void addEdge(int a, int b) {
++edges;
Vec[edges] = b; Next[edges] = G[a];
G[a] = edges;
}
void Update(int l, int r, int delta) {
while(l <= r) {
int b = Block[l];
if(l == Start[b] && End[b] <= r) {
Sum[b] += delta;
l = End[b] + 1;
} else {
Val[l] += delta;
Updated[b] = 0;
l += 1;
}
}
}
void Init(int n) {
for(int i=1; i<=n; i++) {
Block[i] = i / BSIZE;
End[Block[i]] = i;
if(Start[Block[i]] == 0)
Start[Block[i]] = i;
Sort[i] = i;
}
blocks = Block[n] + 1;
}
auto cmp = [](int a, int b) {
return Val[a] < Val[b];
};
void Refresh(int b) {
sort(Sort + Start[b], Sort + End[b] + 1, cmp);
Updated[b] = 1;
}
void Op1(int n, int s) {
Update(B[n], E[n], s);
}
int Op2(int s) {
for(int b = 0; b < blocks; b ++) {
if(!Updated[b])
Refresh(b);
Val[0] = s - Sum[b];
int ind = lower_bound(Sort + Start[b], Sort + End[b] + 1, 0, cmp) - Sort;
if(ind <= End[b] && Val[0] == Val[Sort[ind]])
return Node[Sort[ind]];
}
return -1;
}
void Read(int &a) {
char c;
for(c = getchar(); !isdigit(c); c = getchar());
for(a = 0; isdigit(c); c = getchar())
a = (a << 1) + (a << 3) + c - '0';
}
int main() {
freopen("arbore.in", "r", stdin);
freopen("arbore.out", "w", stdout);
int n, m, a, b, t, s;
Read(n); Read(m);
for(int i=1; i<n; i++) {
Read(a); Read(b);
addEdge(a, b);
addEdge(b, a);
}
Init(n);
dfs(1);
while(m--) {
Read(t);
if(t == 2) {
Read(s);
printf("%d\n", Op2(s));
} else {
Read(a); Read(s);
Op1(a, s);
}
}
return 0;
}