Submission #812179

#TimeUsernameProblemLanguageResultExecution timeMemory
812179alvingogoInside information (BOI21_servers)C++14
100 / 100
437 ms33372 KiB
#include <bits/stdc++.h>
#pragma GCC optimize("Ofast")
#define AquA cin.tie(0);ios_base::sync_with_stdio(0);
#define fs first
#define sc second
#define p_q priority_queue
using namespace std;

struct BIT{
    int n;
    vector<int> bt;
    void init(int x){
        n=x;
        bt.resize(n+1);
    }
    void update(int x,int y){
        x++;
        for(;x<=n;x+=(x&-x)){
            bt[x]+=y;
        }
    }
    int query(int x){
        x++;
        int ans=0;
        for(;x>0;x-=(x&-x)){
            ans+=bt[x];
        }
        return ans;
    }
}bt;

vector<int> ans;
struct no{
    vector<pair<int,int> > ch;
    int ab=0;
    int sz;
    int vis=0;
    vector<int> l;
    vector<pair<int,int> > r;
    int fa=-1;
};
vector<no> v;
void init(int x){
    v.resize(x);
}
int dfs(int r,int f,int n){
    v[r].sz=1;
    int s=-1;
    for(auto h:v[r].ch){
        if(!v[h.fs].vis && h.fs!=f){
            s=max(s,dfs(h.fs,r,n));
            v[r].sz+=v[h.fs].sz;
        }
    }
    if(s>=0){
        return s;
    }
    else if(v[r].sz>n/2){
        return r;
    }
    else{
        return -1;
    }
}
void dfs2(int r,int f){
    v[r].sz=1;
    v[r].fa=-1;
    for(auto h:v[r].ch){
        if(!v[h.fs].vis && h.fs!=f){
            dfs2(h.fs,r);
            v[r].sz+=v[h.fs].sz;
        }
    }
}
void dfs3(int r,int f,int z){
    for(auto h:v[r].l){
        ans[h]+=bt.query(h);
    }
    for(auto h:v[r].r){
        if(v[h.fs].fa>=0 && v[h.fs].fa<h.sc){
            ans[h.sc]=-2;
        }
    }
    for(auto h:v[r].ch){
        if(!v[h.fs].vis && h.fs!=f && h.sc<z){
            dfs3(h.fs,r,h.sc);
        }
    }
}
vector<int> g;
void dfs4(int r,int f,int z){
    g.push_back(z);
    v[r].fa=z;
    bt.update(z,1);
    for(auto h:v[r].ch){
        if(!v[h.fs].vis && h.fs!=f && h.sc>z){
            dfs4(h.fs,r,h.sc);
        }
    }
}
void dc(int r,int n){
    r=dfs(r,r,n);
    int m=v[r].ch.size();
    for(int i=m-1;i>=0;i--){
        auto h=v[r].ch[i];
        if(v[h.fs].vis){
            continue;
        }
        bt.update(h.sc,1);
        v[r].fa=h.sc;
        dfs3(h.fs,r,h.sc);
        dfs4(h.fs,r,h.sc);
        v[r].fa=-1;
        bt.update(h.sc,-1);
    }
    for(auto h:v[r].l){
        ans[h]+=bt.query(h)+1;
    }
    for(auto h:v[r].r){
        if(v[h.fs].fa>=0 && v[h.fs].fa<h.sc){
            ans[h.sc]=-2;
        }
    }
    while(g.size()){
        auto h=g.back();
        g.pop_back();
        bt.update(h,-1);
    }
    dfs2(r,r);
    v[r].vis=1;
    for(auto h:v[r].ch){
        if(!v[h.fs].vis){
            dc(h.fs,v[h.fs].sz);
        }
    }
}
int main(){
    AquA;
    int n,k;
    cin >> n >> k;
    int q=(n-1+k);
    vector<pair<int,pair<int,int> > > qr;
    bt.init(q+2);
    v.resize(n);
    ans.resize(q,0);
    for(int i=0;i<q;i++){
        char s;
        cin >> s;
        if(s=='S'){
            int a,b;
            cin >> a >> b;
            a--;
            b--;
            v[a].ch.push_back({b,i});
            v[b].ch.push_back({a,i});
            ans[i]=-3;
        }
        else if(s=='Q'){
            int a,b;
            cin >> a >> b;
            a--;
            b--;
            if(a==b){
                ans[i]=-2;
                continue;
            }
            v[b].r.push_back({a,i});
            ans[i]=-1;
        }
        else{
            int a;
            cin >> a;
            a--;
            v[a].l.push_back(i);
        }
    }
    dc(0,0);
    for(int i=0;i<q;i++){
        if(ans[i]!=-3){
            if(ans[i]<0){
                if(ans[i]==-1){
                    cout << "no\n";
                }
                else{
                    cout << "yes\n";
                }
            }
            else{
                cout << ans[i] << "\n";
            }
        }
    }
    return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...