Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define gc c=getchar()
- #define r(x) read(x)
- #define ll long long
- template<typename T>
- inline void read(T&x){
- x=0;T k=1;char gc;
- while(!isdigit(c)){if(c=='-')k=-1;gc;}
- while(isdigit(c)){x=x*10+c-'0';gc;}x*=k;
- }
- const int N=100005;
- const int INF=1e9;
- int col[N];
- vector<int>G[N];
- int n;
- namespace sp{
- int siz[N];
- int dep[N];
- int son[N];
- int fa[N];
- void dfs1(int x,int f){
- fa[x]=f;
- siz[x]=1;
- dep[x]=dep[f]+1;
- for(int i=0;i<G[x].size();++i){
- int v=G[x][i];
- if(v==f)continue;
- dfs1(v,x);
- siz[x]+=siz[v];
- if(siz[son[x]]<siz[v])son[x]=v;
- }
- }
- int top[N];
- void dfs2(int x,int t){
- top[x]=t;
- if(!son[x])return ;
- dfs2(son[x],t);
- for(int i=0;i<G[x].size();++i){
- int v=G[x][i];
- if(v==fa[x]||v==son[x])continue;
- dfs2(v,v);
- }
- }
- inline int lca(int u,int v){
- while(top[u]!=top[v]){
- if(dep[top[u]]<dep[top[v]])swap(u,v);
- u=fa[top[u]];
- }
- return dep[u]<dep[v]?u:v;
- }
- inline int dist(int u,int v){
- return dep[u]+dep[v]-2*dep[lca(u,v)];
- }
- }
- using sp::dist;
- namespace df{
- struct Heap{
- multiset<int>A;
- inline void ins(int x){
- A.insert(x);
- }
- inline void del(int x){
- A.erase(A.find(x));
- }
- inline int max(){
- return *A.rbegin();
- }
- inline int sec(){
- return *(++A.rbegin());
- }
- inline Heap(){
- A.insert(-INF);
- A.insert(-INF);
- }
- }Ans,A[N],B[N];
- int root,SIZE;
- int siz[N];
- int s[N];
- bool vis[N];
- void getroot(int x,int f){
- siz[x]=1;
- s[x]=0;
- for(int i=0;i<G[x].size();++i){
- int v=G[x][i];
- if(v==f||vis[v])continue;
- getroot(v,x);
- siz[x]+=siz[v];
- s[x]=max(s[x],siz[v]);
- }
- s[x]=max(s[x],SIZE-siz[x]);
- if(s[x]<s[root])root=x;
- }
- int fa[N];
- vector<int>son[N];
- void build(int x,int size){
- vis[x]=1;
- for(int i=0;i<G[x].size();++i){
- int v=G[x][i];
- if(vis[v])continue;
- s[root=0]=SIZE=(siz[x]<siz[v]?size-siz[x]:siz[v]);
- getroot(v,0);
- fa[root]=x;
- son[x].push_back(root);
- build(root,SIZE);
- }
- }
- inline void work(){
- s[root=0]=SIZE=n;
- getroot(1,0);
- build(root,n);
- for(int u=1;u<=n;++u){
- for(int x=u,f;;x=f){
- f=fa[x];
- if(f)A[x].ins(dist(u,f));
- else break;
- }
- }
- for(int i=1;i<=n;++i){
- for(int j=0;j<son[i].size();++j){
- int x=son[i][j];
- B[i].ins(A[x].max());
- }
- B[i].ins(0);
- Ans.ins(B[i].max()+B[i].sec());
- }
- int q;r(q);
- int cnt=n;
- while(q--){
- char s[5];
- scanf("%s",s);
- if(s[0]=='G'){
- if(cnt==0)puts("-1");
- else if(cnt==1)puts("0");
- else printf("%d\n",Ans.max());
- }
- else {
- int u;r(u);
- if(col[u]){
- col[u]=0;
- ++cnt;
- int mx=B[u].max();
- int sc=B[u].sec();
- if(0>B[u].sec()){
- Ans.del(B[u].max()+B[u].sec());
- B[u].ins(0);
- Ans.ins(B[u].max()+B[u].sec());
- }
- else B[u].ins(0);
- for(int x=u,f;;x=f){
- f=fa[x];
- if(f){
- // Ans.del(B[f].max()+B[f].sec());
- // B[f].del(A[x].max());
- // A[x].ins(dist(u,f));
- // B[f].ins(A[x].max());
- // Ans.ins(B[f].max()+B[f].sec());
- int dis=dist(u,f);
- int mxa=A[x].max();
- if(dis>A[x].max()){
- int mx=B[f].max();
- int sc=B[f].sec();
- if(dis>sc){
- Ans.del(B[f].max()+B[f].sec());
- B[f].del(A[x].max());
- A[x].ins(dist(u,f));
- B[f].ins(A[x].max());
- Ans.ins(B[f].max()+B[f].sec());
- }
- else {
- B[f].del(A[x].max());
- A[x].ins(dist(u,f));
- B[f].ins(A[x].max());
- }
- }
- else A[x].ins(dist(u,f));
- }
- else break;
- }
- }
- else {
- col[u]=1;
- --cnt;
- int mx=B[u].max();
- int sc=B[u].sec();
- if(0>=B[u].sec()){
- Ans.del(B[u].max()+B[u].sec());
- B[u].del(0);
- Ans.ins(B[u].max()+B[u].sec());
- }
- else B[u].del(0);
- for(int x=u,f;;x=f){
- f=fa[x];
- if(f){
- // Ans.del(B[f].max()+B[f].sec());
- // B[f].del(A[x].max());
- // A[x].del(dist(u,f));
- // B[f].ins(A[x].max());
- // Ans.ins(B[f].max()+B[f].sec());int dis=dist(u,f);
- int dis=dist(u,f);
- int mxa=A[x].max();
- if(dis>=A[x].max()){
- int mx=B[f].max();
- int sc=B[f].sec();
- if(dis>=sc){
- Ans.del(B[f].max()+B[f].sec());
- B[f].del(A[x].max());
- A[x].del(dist(u,f));
- B[f].ins(A[x].max());
- Ans.ins(B[f].max()+B[f].sec());
- }
- else {
- B[f].del(A[x].max());
- A[x].del(dist(u,f));
- B[f].ins(A[x].max());
- }
- }
- else A[x].del(dist(u,f));
- }
- else break;
- }
- }
- }
- }
- }
- }
- int main(){
- r(n);
- for(int i=1;i<n;++i){
- int u,v;r(u),r(v);
- G[u].push_back(v);
- G[v].push_back(u);
- }
- sp::dfs1(1,0);
- sp::dfs2(1,1);
- df::work();
- return 0;
- }
Add Comment
Please, Sign In to add comment