Pagini recente » Cod sursa (job #3344960) | Cod sursa (job #1167488) | Cod sursa (job #963173) | Cod sursa (job #3325802) | Cod sursa (job #3344959)
#include <fstream>
#include <vector>
#include <cmath>
#include <unordered_map>
using namespace std;
ifstream in("arbore.in");
ofstream out("arbore.out");
int n, q, t;
pair<int, int> poz[100005];
int lin[100005];
vector<int> v[100005];
int BSIZE;
unordered_map<int, int> um[405];
int lazy_add[405];
int val[405];
void dfs(int nod, int tata)
{
t++;
poz[nod].first = t;
lin[t] = nod;
for(auto it: v[nod])
{
if(it == tata)
{
continue;
}
dfs(it, nod);
}
poz[nod].second = t;
}
void update(int st, int dr, int add)
{
int bst = st / BSIZE;
int bdr = dr / BSIZE;
if(bst == bdr)
{
for(int i = st; i<=dr; i++)
{
um[bst][val[i]]--;
val[i] += add;
um[bst][val[i]]++;
}
return;
}
for(int i = st; i<(bst + 1) * BSIZE; i++)
{
um[bst][val[i]]--;
val[i] += add;
um[bst][val[i]]++;
}
for(int i = bst + 1; i<bdr; i++)
{
lazy_add[i] += add;
}
for(int i = bdr * BSIZE; i<=dr; i++)
{
um[bdr][val[i]]--;
val[i] += add;
um[bdr][val[i]]++;
}
}
int query(int x)
{
for(int b = 0; b <= (n + BSIZE - 1) / BSIZE; b++)
{
if(um[b].find(x - lazy_add[b]) != um[b].end())
{
int st = b * BSIZE;
int dr = (b + 1) * BSIZE - 1;
for(int i = st; i<=dr; i++)
{
if(val[i] == x - lazy_add[b])
{
return lin[i];
}
}
exit(1);
}
}
return -1;
}
int main()
{
in>>n>>q;
BSIZE = sqrt(n);
int x, y;
for(int i = 1; i<n; i++)
{
in>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
dfs(1, 0);
for(int i = 1; i<=n; i++)
{
um[poz[i].first / BSIZE][0]++;
val[poz[i].first] = 0;
}
int a, b, c;
while(q--)
{
in>>a;
if(a == 1)
{
in>>b>>c;
update(poz[b].first, poz[b].second, c);
}
else
{
in>>b;
out<<query(b)<<'\n';
}
}
return 0;
}