Pagini recente » Cod sursa (job #2768217) | Cod sursa (job #3159375) | Cod sursa (job #1395282) | Cod sursa (job #2216272) | Cod sursa (job #2399735)
#include<fstream>
#include<vector>
#include<cmath>
#include<bitset>
#define DIM 100010
#define DIMQ 330
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
vector<int> v[DIM];
int l[DIM],aux,st[DIMQ],dr[DIMQ],pp[DIM],e[DIM],b[DIM],ad[DIM],va[DIMQ];
bitset<1000101> f[DIMQ];
int n,k,q,i,a,bb,lim,poz,loc,t,nod,c,en,in,ok,j;
void dfs(int nod, int tata)
{
l[++k]=nod;b[nod]=k;
for(auto it:v[nod])
if(it!=tata) dfs(it,nod);
e[nod]=k;
}
int main()
{
fin>>n>>q;
for(i=1;i<n;i++)
{
fin>>a>>bb;
v[a].push_back(bb);v[bb].push_back(a);
}dfs(1,0);
lim=sqrt(k);poz=0;loc=1;
for(i=1;i<=k;i++)
{
if(poz==0) st[loc]=i;pp[i]=loc;
poz++;if(poz==lim){dr[loc]=i;loc++;poz=0;}
}
if(dr[loc]==0) dr[loc]=k;
for(;q--;)
{
fin>>t;
if(t==1)
{
fin>>nod>>c;
in=b[nod];en=e[nod];
for(i=st[pp[in]];i<=dr[pp[in]];i++) f[pp[in]][ad[i]]=0;
for(i=in;i<=en&&i<=dr[pp[in]];i++) ad[i]+=c;
for(i=st[pp[in]];i<=dr[pp[in]];i++) f[pp[in]][ad[i]]=1;
if(pp[in]==pp[en]) continue;
aux=pp[in]+1;while(aux<pp[en]) va[aux++]+=c;
for(i=st[pp[en]];i<=dr[pp[en]];i++) f[pp[en]][ad[i]]=0;
for(i=st[pp[en]];i<=en;i++) ad[i]+=c;
for(i=st[pp[en]];i<=dr[pp[en]];i++) f[pp[en]][ad[i]]=1;
}
else
{
fin>>c;ok=1;
for(i=pp[1];i<=pp[k]&&ok;i++)
{
if(va[i]<=c&&f[i][c-va[i]])
for(j=st[i];j<=dr[i];j++)
if(ad[j]+va[i]==c)
{
fout<<l[j]<<"\n";
ok=0;break;
}
}
if(ok==1) fout<<"-1\n";
}
}
return 0;
}