Pagini recente » Cod sursa (job #2643059) | Cod sursa (job #1873915) | Cod sursa (job #1182312) | Cod sursa (job #1890761) | Cod sursa (job #940998)
Cod sursa(job #940998)
#include <fstream>
#include <vector>
#include <math.h>
#include <bitset>
#define MAXN 100005
#define MAXSQRTN 320
using namespace std;
ifstream f("arbore.in");
ofstream g("arbore.out");
int n,m,x,y,s,norm[MAXN],cnt,subarb[MAXN],tata[MAXN],tip,a[MAXN],b[MAXSQRTN],sq,normi[MAXN];
vector<int> G[MAXN];
bitset<10*MAXN> v[MAXSQRTN];
void DFS(int p);
void update(int p,int q);
int solve();
int main()
{
int i;
f>>n>>m;
sq=((int)(sqrt((double)n)));
for(i=1;i<n;i++){
f>>x>>y;
G[x].push_back(y);
G[y].push_back(x);}
DFS(1);
for(i=1;i<=(n-1)/sq+1;i++)
v[i][0]=1;
for(i=1;i<=m;i++){
f>>tip;
if(tip==1){
f>>x>>s;
update(norm[x],subarb[x]);}
else{
f>>s;
g<<solve()<<'\n';}}
f.close();
g.close();
return 0;
}
void DFS(int p){
int i;
norm[p]=(++cnt);
normi[cnt]=p;
for(i=0;i<G[p].size();i++){
x=G[p][i];
if(x!=tata[p]){
tata[x]=p;
DFS(x);}}
subarb[p]=cnt;}
void update(int p,int q){
int i;
x=(p-1)/sq+1;
y=(q-1)/sq+1;
for(p;p<=q&&(p%sq)!=1;p++){
v[x][a[p]]=0;
a[p]+=s;}
for(q;q>=p&&(q%sq);q--){
v[y][a[q]]=0;
a[q]+=s;}
for(i=(x-1)*sq+1;i<=x*sq;i++)
v[x][a[i]]=1;
for(i=(y-1)*sq+1;i<=y*sq;i++)
v[y][a[i]]=1;
if(p>q)
return;
p=p/sq+1;
q/=sq;
for(p;p<=q;p++)
b[p]+=s;}
int solve(){
int i,j;
for(i=1;i<=(n-1)/sq+1;i++)
if((s-b[i]>=0)&&v[i][s-b[i]]){
s-=b[i];
for(j=(i-1)*sq+1;a[j]!=s;j++);
return normi[j];}
return -1;}