Pagini recente » Cod sursa (job #484576) | Cod sursa (job #1502002) | Cod sursa (job #1233949) | Monitorul de evaluare | Cod sursa (job #3225271)
#include <fstream>
#include <vector>
#include <map>
using namespace std;
ifstream fin("arbore.in");
ofstream fout("arbore.out");
const int Nmax = 100005, SQ = 325;
int n,m,sq,k,v[Nmax],mark[Nmax],scv[Nmax],s[SQ],crq[SQ],pos[Nmax],val[Nmax];
vector<int> L[Nmax];
map<int, int> fr[SQ];
void dfs(int node){
pos[node] = ++k;
v[k] = node;
for(int son : L[node]){
if(pos[son] == 0)
dfs(son);
}
mark[node] = k+1;
}
int main()
{
int i,j,l,c,r;
fin >> n >> m;
for(i=1;i<=n-1;i++){
int x,y;
fin >> x >> y;
L[x].push_back(y);
L[y].push_back(x);
}
k = 0;
dfs(1);
sq = 1;
while(sq*sq<=n)
sq++;
c = n/sq; r = n-sq*c;
j = 1;
for(i=1;i<=r;i++){
s[i] = j;
j+=(c+1);
for(l=s[i];l<j;l++)
scv[l] = i;
fr[i][0] = c+1;
}
for(i=r+1;i<=sq;i++){
s[i] = j;
j+=c;
for(l=s[i];l<j;l++)
scv[l] = i;
fr[i][0] = c;
}
s[sq+1] = n+1;
scv[n+1] = sq+1;
for(int itr=1;itr<=m;itr++){
int t;
fin >> t;
if(t == 1){
int node,sum,st,dr,p;
fin >> node >> sum;
p = pos[node];
st = scv[p-1]+1;
dr = scv[mark[node]]-1;
if(st<=dr){
for(i=st;i<=dr;i++)
crq[i]+=sum;
for(i=p;i<s[st];i++){
val[i]+=sum;
fr[scv[i]][val[i]-sum]--;
fr[scv[i]][val[i]]++;
if(fr[scv[i]][val[i]-sum] == 0)
fr[scv[i]].erase(val[i]-sum);
}
for(i=mark[node]-1;i>=s[dr+1];i--){
val[i]+=sum;
fr[scv[i]][val[i]-sum]--;
fr[scv[i]][val[i]]++;
if(fr[scv[i]][val[i]-sum] == 0)
fr[scv[i]].erase(val[i]-sum);
}
}
else{
for(i=p;i<mark[node];i++){
val[i]+=sum;
fr[scv[i]][val[i]-sum]--;
fr[scv[i]][val[i]]++;
if(fr[scv[i]][val[i]-sum] == 0)
fr[scv[i]].erase(val[i]-sum);
}
}
}
else{
int sum,nr = 0;
fin >> sum;
i = 1;
while(i<=sq && nr == 0){
nr = fr[i][sum-crq[i]];
if(nr>0){
j = s[i];
while(j<s[i+1] && val[j]!=sum-crq[i])
j++;
fout << v[j] << '\n';
}
else
fr[i].erase(sum-crq[i]);
i++;
}
if(nr == 0)
fout << "-1\n";
}
}
return 0;
}