题意:在线求出树上指定一个点到树中任意一个黑点的简单路径中 index最小的Index
解:
1、现给定一个黑点之后,在不使得任何一个白点变为黑点的情况下,1e6的数据量我们干不了什么,做了一遍dfs之后,我们得到每个点到现在唯一的黑点路径上的最小编号。
2.那么每次更新更新一个黑点就是使得图上每个点最开始的答案res[x],再这个基础上考虑更新的黑点到最开始的根上的答案。
#include<bits/stdc++.h>
#define en '\n'
#define ll long long
const int maxn =1e6+10;
using namespace std;
int rd(){int t;scanf("%d",&t);return t;}
int res[maxn];
vector<int>vec[maxn];
void dfs(int x,int f,int mi){
res[x]=min(mi,x);
for(int i=0;i<vec[x].size();i++){
int y=vec[x][i];if(y==f)continue;
dfs(y,x,res[x]);
}
}
signed main()
{
#ifdef local
freopen("input2.txt","r",stdin);
#endif
#define mem(a,b) memset(a,b,sizeof(a))
#define pb push_back
int n=rd(),q=rd();
for(int i=1;i<n;i++){
int x=rd(),y=rd();
vec[x].pb(y),vec[y].pb(x);
}
q-=1;
int las=0;
int op=rd(),x=rd();
x=(x+las)%n+1;
dfs(x,0,x);
int tem=x;
while(q--){
int op=rd(),x=rd();
x=(x+las)%n+1;
if(op==1){
tem=min(tem,res[x]);
}else{
las=min(res[x],tem);
cout<<las<<en;
}
}
return 0;
}