Pagini recente » Cod sursa (job #2200899) | Cod sursa (job #1018617) | Cod sursa (job #1923847) | Cod sursa (job #2894154) | Cod sursa (job #2833191)
#include <bits/stdc++.h>
#define rad 355
using namespace std;
ifstream f ("arbore.in");
ofstream g ("arbore.out");
int a[100005];
vector <int> v[100005];
int radical[360];
map <int, int> m[360];
int n;
int q;
int lung;
int sfarsit[100005];
int valoare[100005];
int inceput[100005];
void DFS(int nod, int tata)
{
a[++lung]=nod;
inceput[nod]=lung;
for(int x=0; x<v[nod].size(); ++x)
{
int fiu=v[nod][x];
if(fiu!=tata)
DFS(fiu, nod);
}
sfarsit[nod]=lung;
}
void Update(int st, int dr, int sum)
{
int bucketst=st/rad+1;
int bucketdr=dr/rad;
if(st==2)
{
cout<<"YES";
}
for(int i=st; i<=min(dr , bucketst*rad-1); ++i)
{
int x=valoare[i];
valoare[i]+=sum;
m[bucketst-1][x]=0;
m[bucketst-1][x+sum]=i;
}
for(int i=bucketst;i<=bucketdr;++i)
radical[i]+=sum;
for(int i=(bucketdr+1)*rad;i<=dr;++i)
{
int x=valoare[i];
m[bucketdr+1][x]=0;
m[bucketdr+1][x+sum]=i;
}
}
int Query(int suma)
{
for(int i=0;i<=n/rad+1;++i)
{
int s=radical[i];
if(m[i][suma-s]!=0)
return m[i][suma-s];
}
}
int main()
{
f>>n>>q;
for(int i=1; i<n; ++i)
{
int x, y;
f>>x>>y;
v[x].push_back(y);
}
DFS(1, 0);
for(int query=1; query<=q; ++query)
{
int t;
f>>t;
if(t==1)
{
int nod, suma;
f>>nod>>suma;
Update(inceput[nod], sfarsit[nod], suma);
}
if(t==2)
{
int suma;
f>>suma;
g<<Query(suma)<<"\n";
}
}
return 0;
}