Pagini recente » Cod sursa (job #579073) | Cod sursa (job #2692582) | Cod sursa (job #2662007) | Cod sursa (job #64680) | Cod sursa (job #2924074)
#include <bits/stdc++.h>
#define rad 355
using namespace std;
ifstream f ("arbore.in");
ofstream g ("arbore.out");
int n,q;
vector <int> v[100005];
struct el
{
int adun;
map<int, int> m;
};
el a[rad];
int s[100005];
int subarb[100005];
int valoare[100005];
int ord[100005];
int cont;
void DFS(int nod, int tata)
{
if(s[nod]==0)
{
s[nod]=++cont;
ord[cont]=nod;
}
for(int x=0; x<v[nod].size(); ++x)
{
int fiu=v[nod][x];
if(fiu!=tata)
DFS(fiu, nod);
}
if(subarb[nod]==0)
subarb[nod]=cont;
}
int grupa(int k)
{
return (k-1)/rad+1;
}
void Update(int st, int dr, int val)
{
int gs=grupa(st);
int gf=grupa(dr);
for(int i=gs+1; i<=gf-1; ++i)
a[i].adun+=val;
for(int i=st; i<=min(dr , gs*rad); ++i)
{
int p=valoare[i];
a[gs].m[p]--;
valoare[i]+=val;
p=valoare[i];
a[gs].m[p]++;
}
if(gs!=gf)
for(int i=max(st , (gf-1)*rad+1); i<=dr; ++i)
{
int p=valoare[i];
a[gf].m[p]--;
valoare[i]+=val;
p=valoare[i];
a[gf].m[p]++;
}
}
int caut(int grupa, int val)
{
for(int i=(grupa-1)*rad+1; i<=min(grupa*rad, n); ++i)
{
int x=ord[i];
if(valoare[x]==val)
return ord[i];
}
}
int Query(int val)
{
for(int i=1; i<=grupa(n); ++i)
{
int x=a[i].adun;
if(a[i].m[val-x]>0)
{
return caut(i, val-x);
}
}
return -1;
}
int main()
{
f>>n>>q;
for(int i=1; i<n; ++i)
{
int x,y;
f>>x>>y;
v[x].push_back(y);
v[y].push_back(x);
}
DFS(1, 0);
for(int i=1; i<=q; ++i)
{
int tip;
f>>tip;
if(tip==1)
{
int nod, val;
f>>nod>>val;
Update(s[nod], subarb[nod], val);
}
if(tip==2)
{
int val;
f>>val;
g<<Query(val)<<"\n";
}
}
return 0;
}