Pagini recente » Cod sursa (job #221370) | Cod sursa (job #2021381) | Cod sursa (job #2879077) | Cod sursa (job #2437942) | Cod sursa (job #1956779)
#include <bits/stdc++.h>
using namespace std;
#define FILE_IO
int BLOCK_SIZE, K;
int N, Q;
vector <int> edg[100005];
int I, itv[100005][2];
int nd[210005];
int vl[210005];
bitset <1000005> bts[455];
int add[455];
void DFS(int nod, int fth)
{
itv[nod][0] = ++I;
nd[I] = nod;
for(auto nxt: edg[nod])
{
if(nxt == fth) continue;
DFS(nxt, nod);
}
itv[nod][1] = I;
//nd[I] = nod;
}
void updateBlock(int id, int lft, int rgt, int val)
{
for(int i = id * BLOCK_SIZE; i < (id + 1) * BLOCK_SIZE; i++)
bts[id][ vl[i] ] = 0;
for(int i = id * BLOCK_SIZE; i < (id + 1) * BLOCK_SIZE; i++)
{
vl[i] += add[id];
if(lft <= i && i <= rgt) vl[i] += val;
bts[id][ vl[i] ] = 1;
}
add[id] = 0;
}
void update(int st, int dr, int val)
{
int blkst = st / BLOCK_SIZE;
int blkdr = dr / BLOCK_SIZE;
if(blkst == blkdr)
{
updateBlock(blkst, st, dr, val);
return;
}
for(int i = blkst + 1; i < blkdr; i++)
add[i] += val;
updateBlock(blkst, st, (blkst + 1) * BLOCK_SIZE - 1, val);
updateBlock(blkdr, blkdr * BLOCK_SIZE, dr, val);
}
int query(int val)
{
for(int i = 0; i < K - 1; i++)
if(val >= add[i] && bts[i][ val - add[i] ])
{
for(int j = i * BLOCK_SIZE; j < (i + 1) * BLOCK_SIZE; j++)
if(vl[j] + add[i] == val)
return nd[j];
}
for(int i = (K - 1) * BLOCK_SIZE; i < I; i++)
if(vl[i] + add[K - 1] == val)
return nd[i];
return (-1);
}
int gint()
{
char ch = getchar();
while(ch < '0' || '9' < ch)
ch = getchar();
int x = 0;
while('0' <= ch && ch <= '9')
{
x = x * 10 + ch - '0';
ch = getchar();
}
return x;
}
int main()
{
#ifdef FILE_IO
freopen("arbore.in", "r", stdin);
freopen("arbore.out", "w", stdout);
#endif
//scanf("%d%d", &N, &Q);
N = gint();
Q = gint();
for(int i = 1; i < N; i++)
{
int x, y;
//scanf("%d%d", &x, &y);
x = gint();
y = gint();
edg[x].push_back(y);
edg[y].push_back(x);
}
I = -1;
DFS(1, 0);
I++;
//BLOCK_SIZE = (int)sqrt(I);
BLOCK_SIZE = 225;
K = I / BLOCK_SIZE + 1;
for(int i = 0; i < K; i++)
bts[i][0] = 1;
while(Q--)
{
int op;
//scanf("%d", &op);
op = gint();
if(op == 1)
{
int nod, val;
//scanf("%d%d", &nod, &val);
nod = gint();
val = gint();
update(itv[nod][0], itv[nod][1], val);
}
else
{
int val;
//scanf("%d", &val);
val = gint();
int ans = query(val);
printf("%d\n", ans);
}
}
return 0;
}