Pagini recente » Rating Dicu Madalina (mada_mady) | Cod sursa (job #778856) | Cod sursa (job #1716640) | Cod sursa (job #1387940) | Cod sursa (job #3194920)
#include <fstream>
#include <vector>
#include <algorithm>
#include <unordered_map>
#include <cmath>
#define sz 100000
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
vector <long long> vec[sz + 5];
long long n,m;
long long o = 0;
long long fr[sz + 5];
long long lt[sz + 5];
long long iv[2*sz + 5];
long long v[sz*2 + 5];
struct bucket
{
long long st;
long long dr;
unordered_map<long long,long long> f;
long long ssum=0;
void update(long long st_,long long dr_,long long val)
{
for(int i = st_; i<=dr_; i++)
{
if(f.find(v[i])!=f.end()){
f[v[i]]--;
if(f[v[i]]==0)
f.erase(v[i]);
}
v[i]+=val;
if(f.find(v[i])==f.end())
f[v[i]]=1;
else
f[v[i]]++;
}
}
long long query(long long val)
{
if(f.find(val-ssum)==f.end())
return -1;
for(int i=st;i<=dr;i++)
{
if(v[i]+ssum==val)
return iv[i];
}
}
}b[600];
long long bnr;
long long lg;
void update(long long nod,long long val)
{
long long x = fr[nod];
long long y = lt[nod];
long long st = x/lg + (x%lg!=0);
b[st].update(x,min(y,b[st].dr),val);
st++;
while(y >= b[st].dr)
{
b[st].ssum+=val;
st++;
}
if( y >= b[st].st)
b[st].update(b[st].st,y,val);
}
long long query(long long val)
{
long long sol = -1;
for(int i=1;i<=bnr && sol==-1;i++)
sol = b[i].query(val);
return sol;
}
void dfs(long long nod,long long p)
{
fr[nod]=++o;
iv[o]=nod;
for(auto& i : vec[nod])
if(i!=p)
dfs(i,nod);
lt[nod]=++o;
iv[o]=nod;
}
int main()
{
fin>>n>>m;
for(int i=1; i<n; i++)
{
long long x,y;
fin>>x>>y;
vec[x].push_back(y);
vec[y].push_back(x);
}
dfs(1,0);
lg = sqrt(o);
bnr = o/lg + (o%lg!=0);
for(int i = 1 ; i<= bnr;i++)
{
b[i].st=(i-1)*lg+1;
b[i].dr=i*lg;
b[i].ssum=0;
}
b[bnr+1].st=o*2;
b[bnr+1].dr=o*2;
for(int i=1;i<=m;i++)
{
long long tp;
fin>>tp;
if(tp==1)
{
long long p,s;
fin>>p>>s;
update(p,s);
}
else
{
long long s;
fin>>s;
int sol = query(s);
fout<<sol<<'\n';
}
}
}