Submission #1140437

#TimeUsernameProblemLanguageResultExecution timeMemory
1140437mnbvcxz123Inside information (BOI21_servers)C++20
5 / 100
155 ms37128 KiB
#include<bits/stdc++.h>
using namespace std;
using ll=long long;
using pi=pair<int,int>;

#define fi first
#define se second

constexpr int N=2e5+5;
int n,q;

int aib[2*N+5];
vector<int>undo;

void update(int pos, int val){
    while(pos<n+q){
        aib[pos]+=val;
        undo.push_back(pos);
        pos+=pos&-pos;
    }
}

int query(int pos){
    int ans=0;
    while(pos){
        ans+=aib[pos];
        pos-=pos&-pos;
    }
    return ans;
}

void clear(){
    for(const int&i:undo)aib[i]=0;
    undo.clear();
}

struct Query{
    char type;
    int to,time;
};

vector<Query>qry[N+5];
vector<pi>g[N+5];
int ans[2*N+5],sz[2*N+5];
int mtp[N+5];
int crd[N+5];
int par[N+5];
int sub[N+5];
bool del[N+5];
bool nigga[N+5];

void dfssz(int v, int e){
    sz[v]=1;
    for(const auto&[i,j]:g[v])
        if(!del[i] and i!=e)
            dfssz(i,v),sz[v]+=sz[i];
}

int getcent(int v, int kutas){
    for(const auto&[i,j]:g[v])
        if(!del[i] and sz[i]<sz[v] and sz[i]>kutas)
            return getcent(i,kutas);
    return v;
}

void dfs(int v, vector<int>&x){
    x.push_back(v);
    nigga[v]=1;
    for(auto[i,j]:g[v]){
        if(del[i] or i==par[v])continue;
        par[i]=v;
        sub[i]=sub[v];
        mtp[i]=j;
        crd[i]=0;
        if(j<mtp[v] and (crd[v]&1))crd[i]=0;
        if(j>mtp[v] and (crd[v]&2))crd[i]+=2;
        dfs(i,x);
    }
}

void decomp(int v){
    dfssz(v,0);
    int cen=getcent(v,sz[v]>>1);
    vector<pair<int,vector<int>>>subarb;
    for(const auto&[i,j]:g[cen]){
        if(del[i])continue;
        subarb.push_back({i,{}});
        par[i]=cen;
        sub[i]=i;
        mtp[i]=j;
        crd[i]=3;
        dfs(i,subarb.back().se);
    }
    mtp[cen]=0;
    sort(subarb.begin(),subarb.end(),[&](auto a, auto b){
        return mtp[a.fi]>mtp[b.fi];
    });
    nigga[cen]=1;
    crd[cen]=3;
    update(1,1);
    for(const auto&[i,vec]:subarb){
        for(auto j:vec)
            for(auto k:qry[j]){
                if(k.type=='c'){
                    if(mtp[sub[j]]<=k.time and (crd[j]&1))
                        ans[k.time]+=query(k.time);
                }else {
                    if(k.to!=cen and nigga[k.to] and mtp[sub[k.to]]>mtp[sub[j]]
                        and mtp[k.to]<=k.time and (crd[k.to]&2) and (crd[j]&1))
                            ans[k.time]=-1;
                    else if(k.to==cen and (crd[j]&1) and mtp[sub[j]]<=k.time)
                        ans[k.time]=-1;
                }
            }
        for(auto j:vec)
            if(crd[j]&2)
                update(mtp[j],1);
    }
    update(1,-1);
    for(auto i:qry[cen]){
        if(i.type=='c')
            ans[i.time]+=query(i.time);
        else{
            if(nigga[i.to] and (crd[i.to]&2) and mtp[i.to]<=i.time)
                ans[i.time]=-1;
        }
    }
    clear();
    nigga[cen]=0;
    for(auto i:subarb)
        for(auto j:i.se)
            nigga[j]=0;
    del[cen]=1;
    for(auto[i,j]:g[cen])
        if(!del[i])
            decomp(i);
}

int main(){
    ios::sync_with_stdio(false);
    cin.tie(nullptr);
    cout.tie(nullptr);
    cin>>n>>q;
    for(int i=1;i<n+q;++i){
        char t;
        cin>>t;
        if(t=='S'){
            int u,v;
            cin>>u>>v;
            g[u].push_back({v,i});
            g[v].push_back({u,i});
            ans[i]=-3;
        }else if(t=='Q'){
            int u,v;
            cin>>u>>v;
            qry[v].push_back({'q',u,i});
            ans[i]=-2;
        }else{
            int u;
            cin>>u;
            qry[u].push_back({'c',0,i});
        }
    }
    decomp(1);
    for(int i=1;i<n+q;++i){
        if(ans[i]==-1)
            cout<<"yes\n";
        else if(ans[i]==-2)
            cout<<"no\n";
        else if(ans[i]>=0)
            cout<<ans[i]+1<<'\n';
    }
}
#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...