Pagini recente » Cod sursa (job #391352) | Cod sursa (job #1925807) | Cod sursa (job #1207799) | Cod sursa (job #1607977) | Cod sursa (job #2833206)
#include <bits/stdc++.h>
#define rad 355
using namespace std;
ifstream f ("arbore.in");
ofstream g ("arbore.out");
int a[200005];
vector <int> v[200005];
int radical[1000];
map <int, int> m[1000];
int n;
int q;
int lung;
int sfarsit[200005];
int valoare[200005];
int inceput[200005];
void DFS(int nod, int tata)
{
a[++lung]=nod;
inceput[nod]=lung;
for(int x=0; x<v[nod].size(); ++x)
{
int fiu=v[nod][x];
if(fiu!=tata)
DFS(fiu, nod);
}
sfarsit[nod]=lung;
}
void Update(int st, int dr, int sum)
{
int bucketst=st/rad+1;
int bucketdr=dr/rad;
for(int i=st; i<=min(dr, bucketst*rad-1); ++i)
{
int x=valoare[i];
valoare[i]+=sum;
if(m[bucketst-1][x]>0)
m[bucketst-1][x]--;
m[bucketst-1][x+sum]++;
}
for(int i=bucketst; i<=bucketdr; ++i)
radical[i]+=sum;
for(int i=(bucketdr+1)*rad; i<=dr; ++i)
{
int x=valoare[i];
valoare[i]+=sum;
if(m[bucketdr+1][x]>0)
m[bucketdr+1][x]--;
m[bucketdr+1][x+sum]++;
}
}
int Query(int suma)
{
for(int i=0; i<=n/rad+1; ++i)
{
int s=radical[i];
if(m[i][suma-s]>0)
{
for(int j=rad*i; j<=min(n, rad*(i+1)); ++j)
if(valoare[j]==suma-s)
return j;
}
}
return -1;
}
int main()
{
f>>n>>q;
for(int i=1; i<n; ++i)
{
int x, y;
f>>x>>y;
v[x].push_back(y);
}
DFS(1, 0);
for(int query=1; query<=q; ++query)
{
int t;
f>>t;
if(t==1)
{
int nod, suma;
f>>nod>>suma;
Update(inceput[nod], sfarsit[nod], suma);
}
if(t==2)
{
int suma;
f>>suma;
g<<Query(suma)<<"\n";
}
}
return 0;
}