Pagini recente » Cod sursa (job #688218) | Cod sursa (job #1124739) | Cod sursa (job #831397) | Cod sursa (job #1151796) | Cod sursa (job #3146380)
#include <fstream>
#include <vector>
#include <bitset>
using namespace std;
ifstream in ("arbore.in");
ofstream out ("arbore.out");
const int max_size = 1e5 + 1, max_nr = 1e6 + 1, sz = 316;
int v[max_size], lazy[sz + 20], tin[max_size], tout[max_size], timp, poz[max_size], n, nrbkt;
bitset <max_nr> frecv[sz + 20];
vector <int> mc[max_size];
void dfs (int nod, int par)
{
tin[nod] = ++timp;
poz[timp] = nod;
for (auto f : mc[nod])
{
if (f == par)
{
continue;
}
dfs(f, nod);
}
tout[nod] = timp;
}
void updbkt (int bkt, int l, int r, int x)
{
int bktst = bkt * sz, bktdr = (bkt + 1) * sz - 1;
for (int i = max(1, bktst); i <= min(n, bktdr); i++)
{
frecv[bkt][v[i]] = 0;
}
for (int i = l; i <= r; i++)
{
v[i] += x;
}
for (int i = max(1, bktst); i <= min(n, bktdr); i++)
{
frecv[bkt][v[i]] = 1;
}
}
void updlz (int nod, int x)
{
int st = tin[nod], dr = tout[nod], bktst = st / sz, bktdr = dr / sz;
if (bktst == bktdr)
{
updbkt(bktst, st, dr, x);
return;
}
updbkt(bktst, st, (bktst + 1) * sz - 1, x);
updbkt(bktdr, bktdr * sz, dr, x);
for (int i = bktst + 1; i < bktdr; i++)
{
lazy[i] += x;
}
}
int main ()
{
int q;
in >> n >> q;
for (int i = 1; i < n; i++)
{
int x, y;
in >> x >> y;
mc[x].push_back(y);
mc[y].push_back(x);
}
nrbkt = n / sz;
for (int i = 0; i <= nrbkt; i++)
{
frecv[i][0] = 1;
}
dfs(1, 0);
while (q--)
{
int op;
in >> op;
if (op == 1)
{
int nod, x;
in >> nod >> x;
updlz(nod, x);
}
else
{
int x, ans = -1;
in >> x;
for (int i = 0; i <= nrbkt; i++)
{
if (x < lazy[i] || frecv[i][x - lazy[i]] == 0)
{
continue;
}
int val = x - lazy[i];
for (int j = max(1, i * sz); j < min(n, (i + 1) * sz); j++)
{
if (v[j] == val)
{
ans = poz[j];
}
}
}
out << ans << '\n';
}
}
in.close();
out.close();
return 0;
}