Pagini recente » Cod sursa (job #3219248) | Cod sursa (job #1554596) | Cod sursa (job #1971551) | Cod sursa (job #1554306) | Cod sursa (job #2786883)
#include <bits/stdc++.h>
using namespace std;
ifstream f ("arbore.in");
ofstream g ("arbore.out");
int n,q;
vector <int> v[100005];
int radical[500];
bitset <500> fr[100005];
int a[100005];
int cont;
int inceput[100005];
int sfarsit[100005];
int x;
int val[100005];
void DFS(int nod, int tata)
{
a[++cont]=nod;
inceput[nod]=cont;
for(int x=0; x<v[nod].size(); ++x)
{
if(v[nod][x]!=tata)
DFS(v[nod][x], nod);
}
sfarsit[nod]=cont;
}
void update(int st, int dr, int valoare)
{
int cadran=(st-1)/x+1;
for(int i=(cadran-1)*x+1 ; i<=cadran*x; ++i)
fr[cadran][val[i]]=0;
for(int i=st; i<=dr && i<=cadran*x; ++i)
val[i]+=valoare;
for(int i=(cadran-1)*x+1 ; i<=cadran*x; ++i)
fr[cadran][val[i]]=1;
if(cadran==(dr-1)/x+1)
return ;
int cadran2=(dr-1)/x+1;
for(int i=cadran+1; i<=cadran2; ++i)
radical[i]+=valoare;
for(int i=(cadran2-1)*x+1 ; i<=cadran2*x; ++i)
fr[cadran2][val[i]]=0;
for(int i=(cadran2-1)*x+1 ; i<=dr; ++i)
val[i]+=valoare;
for(int i=(cadran2-1)*x+1 ; i<=cadran2*x; ++i)
fr[cadran2][val[i]]=1;
}
int main()
{
f>>n>>q;
for(int i=1; i<n; ++i)
{
int a, b;
f>>a>>b;
v[a].push_back(b);
v[b].push_back(a);
}
x=sqrt(n);
DFS(1, 0);
for(int query=1; query<=q; ++query)
{
int tip;
f>>tip;
if(tip==1)
{
int sursa, valoare;
f>>sursa>>valoare;
update(inceput[sursa], sfarsit[sursa], valoare);
}
if(tip==2)
{
int vali;
f>>vali;
int ok=0;
for(int i=1; i<=n/x+1; ++i)
{
if(ok==1)
break;
int dif=vali-radical[i];
if(fr[i][dif]==1 && ok==0)
{
for(int j=(i-1)*x+1; j<=i*x; ++j)
if(val[j]==dif && ok==0)
{
g<<a[j]<<"\n";
ok=1;
}
}
}
}
}
return 0;
}