Pagini recente » Cod sursa (job #663110) | Cod sursa (job #3279368) | Cod sursa (job #223954) | Cod sursa (job #3212605) | Cod sursa (job #3233504)
#include <bits/stdc++.h>
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
const int nmax = 100001, sqmax = 318;
unordered_map<int, int> fr[sqmax];
vector<int> L[nmax];
int m, n, sq, siz, i;
int subarb[nmax];
int poz[nmax], sum[nmax], v[nmax];
int st[sqmax], dr[sqmax], sumbuc[sqmax];
void dfs(int node, int father)
{
subarb[node] = 1;
v[i] = node;
poz[node] = i++;
for (auto son : L[node])
{
if (son != father)
dfs(son, node);
}
subarb[father] += subarb[node];
}
void update(int root, int val)
{
int x = poz[root], y = x + subarb[root] - 1;
int stbuc = (x / sq), drbuc = (y / sq);
if (drbuc == stbuc)
{
for (int i = x; i <= y; ++i)
{
fr[drbuc][sum[i]]--;
if (fr[drbuc][sum[i]] == 0)
fr[drbuc].erase(fr[drbuc].find(sum[i]));
sum[i] += val;
fr[drbuc][sum[i]]++;
}
}
else
{
for (int i = x; i <= dr[stbuc]; ++i)
{
fr[stbuc][sum[i]]--;
if (fr[stbuc][sum[i]] == 0)
fr[stbuc].erase(fr[stbuc].find(sum[i]));
sum[i] += val;
fr[stbuc][sum[i]]++;
}
for (int i = y; i >= st[drbuc]; --i)
{
fr[drbuc][sum[i]]--;
if (fr[drbuc][sum[i]] == 0)
fr[drbuc].erase(fr[drbuc].find(sum[i]));
sum[i] += val;
fr[drbuc][sum[i]]++;
}
for (int i = stbuc + 1; i < drbuc; ++i)
{
sumbuc[i] += val;
}
}
}
int query(int s)
{
for (int i = 0; i < siz; ++i)
{
if (fr[i].find(s - sumbuc[i]) != fr[i].end())
{
for (int sol = st[i]; sol <= dr[i]; ++sol)
{
if (sum[sol] == s - sumbuc[i])
{
return v[sol];
}
}
}
}
return -1;
}
int main()
{
fin >> n >> m;
sq = sqrt(n);
siz = n / sq + 1;
if (n % sq == 0)
siz--;
st[0] = 0;
dr[0] = sq - 1;
for (int i = 1; i < siz; ++i)
{
st[i] = st[i - 1] + sq;
dr[i] = dr[i - 1] + sq;
}
dr[siz - 1] = n - 1;
for (int i = 0; i < siz; ++i)
fr[i][0] = dr[i] - st[i] + 1;
for (int i = 1; i < n; ++i)
{
int x, y;
fin >> x >> y;
L[x].push_back(y);
L[y].push_back(x);
}
dfs(1, 0);
while (m--)
{
int q;
fin >> q;
if (q == 1)
{
int root, val;
fin >> root >> val;
update(root, val);
}
else
{
int s;
fin >> s;
fout << query(s) << "\n";
}
}
return 0;
}