Pagini recente » Cod sursa (job #130462) | Cod sursa (job #2863070) | Cod sursa (job #952878) | Cod sursa (job #2519031) | Cod sursa (job #3200449)
#include <fstream>
#include <unordered_map>
#include <vector>
#include <cmath>
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
int n,q,first[100005],last[100005],k,v[300001],valori[300001],L,nrb,S[601],c;
vector <int> A[100005];
unordered_map <int,int> fr[601];
int stb(int bucket)
{
return (bucket-1)*L+1;
}
int drb(int bucket)
{
return min(k,bucket*L);
}
int indb(int nr)
{
return nr/L + (nr%L!=0);
}
void dfs(int nod,int tata)
{
v[++k]=nod;
first[nod]=k;
for(auto i:A[nod])
{
if(i!=tata)
dfs(i,nod);
}
v[++k]=nod;
last[nod]=k;
}
void update(int st,int dr,int val)
{
int bst=indb(st);
int bdr=indb(dr);
int lmax=drb(bst);
for(int i=st;i<=min(lmax,dr);i++)
{
fr[bst][valori[i]]--;
if(fr[bst][valori[i]]<=0)
{
fr[bst].erase(valori[i]);
}
valori[i]+=val;
fr[bst][valori[i]]++;
}
if(bst!=bdr)
{
for(int i=bst+1;i<bdr;i++)
{
S[i]+=val;
}
int lmin=stb(bdr);
for(int i=lmin;i<=dr;i++)
{
fr[bdr][valori[i]]--;
if(fr[bdr][valori[i]]<=0)
{
fr[bdr].erase(valori[i]);
}
valori[i]+=val;
fr[bdr][valori[i]]++;
}
}
}
int query(int val)
{
for(int p=1;p<=nrb;p++)
{
if(fr[p].find(val-S[p])!=fr[p].end())
{
int st=stb(p);
int dr=drb(p);
for(int i=st;i<=dr;i++)
{
if(valori[i]+S[p]==val)
return v[i];
}
}
}
return -1;
}
int main()
{
fin>>n>>q;
for(int i=1;i<n;i++)
{
int x,y;
fin>>x>>y;
A[x].push_back(y);
A[y].push_back(x);
}
dfs(1,0);
L=sqrt(k);
nrb=k/L+ (k%L!=0);
for(int i=1;i<=nrb;i++)
{
int st=stb(i);
int dr=drb(i);
for(int j=st;j<=dr;j++)
fr[i][0]++;
}
for(int i=1;i<=q;i++)
{
fin>>c;
if(c==1)
{
int x,y;
fin>>x>>y;
update(first[x],last[x],y);
}
else
{
int x;
fin>>x;
fout<<query(x)<<"\n";
}
}
return 0;
}