Pagini recente » Cod sursa (job #2987280) | Cod sursa (job #3174524) | Cod sursa (job #2963730) | Cod sursa (job #274257) | Cod sursa (job #2923547)
#include <bits/stdc++.h>
using namespace std;
const int N = 1e5 + 5;
const int rad = 333;
vector <int> g[N];
bitset <1000005> vf[rad + 1];
int in[N], out[N], ord[N];
int v[N], adaug[N];
int n, m, timp;
void dfs(int nod, int dad = 0)
{
in[nod] = ++timp;
ord[timp] = nod;
for (auto son : g[nod])
if (son != dad)
dfs(son, nod);
out[nod] = timp;
}
void f(int gr, int l, int r, int val)
{
for (int i = l; i <= r; i++)
vf[gr][v[i]] = 0;
for (int i = l; i <= r; i++)
{
v[i] += val;
vf[gr][v[i]] = 1;
}
for (int i = gr * rad; i < l; i++)
vf[gr][v[i]] = 1;
for (int i = r + 1; i < (gr + 1) * rad && i <= n; i++)
vf[gr][v[i]] = 1;
}
int main()
{
freopen("arbore.in", "r", stdin);
freopen("arbore.out", "w", stdout);
cin >> n >> m;
for (int i = 1; i < n; i++)
{
int x, y;
cin >> x >> y;
g[x].push_back(y);
g[y].push_back(x);
}
dfs(1);
while(m--)
{
int t, x, y;
cin >> t >> x;
if (t == 1)
{
cin >> y;
int l = in[x], r = out[x];
int gl = l / rad;
int gr = r / rad;
if (gl == gr)
{
f(gl, l, r, y);
continue;
}
f(gl, l, (gl + 1) * rad - 1, y);
f(gr, gr * rad, r, y);
for (int i = gl + 1; i < gr; i++)
adaug[i] += y;
continue;
}
int ans = -1;
for (int i = 0; i <= n / rad; i++)
{
if (x < adaug[i])
continue;
if (vf[i][x - adaug[i]])
{
for (int j = i * rad; j < (i + 1) * rad; j++)
{
if (v[j] + adaug[i] == x && j)
{
ans = j;
break;
}
}
break;
}
}
if (ans == -1)
cout << ans;
else
cout << ord[ans];
cout << '\n';
}
return 0;
}