Submission #846881

#TimeUsernameProblemLanguageResultExecution timeMemory
846881Ahmed57Inside information (BOI21_servers)C++17
52.50 / 100
826 ms132688 KiB
#include <bits/stdc++.h>
using namespace std;
int NODES=0;
bool seg[44000007];int L[44000007],R[44000007],n;
void update(int p, int q, int l, int r, int x)
{
    if(l==r){seg[p]=1;return;}
    int md = (l+r)/2;
    seg[p]=1;
    if(x<=md)R[p]=R[q],L[p]=++NODES,update(L[p],L[q],l,md,x);
    else L[p]=L[q],R[p]=++NODES,update(R[p],R[q],md+1,r,x);
}
bool query(int p,int l,int r,int x){
    if(l==r){
        return seg[p];
    }
    int md=(l+r)/2;
    if(x<=md)return query(L[p],l,md,x);
    else return query(R[p],md+1,r,x);
}
vector<int> v;
void iterate(int p,int l,int r){
    if(!seg[p])return;
    if(l==r)v.push_back(l);
    else{
        int md=(l+r)/2;
        iterate(L[p],l,md);
        iterate(R[p],md+1,r);
    }
}
int pr[125001];
int gs[125001];
void merg(int a,int b){
    if(gs[a]>gs[b])swap(a,b);
    iterate(pr[a],1,n);int tm;
    for(auto x:v){
        tm = ++NODES;
        update(tm,pr[b],1,n,x);
        pr[b]=tm;
    }
    pr[a]=tm,pr[b]=tm,gs[b]+=gs[a],gs[a]=gs[b];
    v.clear();
}
int main(){
    int q;cin>>n>>q;
    if(n<=4000){
        vector<int> v[n+1];
    for(int i = 1;i<=n;i++)v[i].push_back(i);
    int cnt[n+1] = {0};
    for(int i = 1;i<=n;i++)cnt[i] = 1;
    q+=n-1;
    while(q--){
        char s;cin>>s;
        if(s=='S'){
            int a,b;cin>>a>>b;
            set<int> x;
            for(auto i:v[a]){x.insert(i);cnt[i]--;}
            for(auto i:v[b]){x.insert(i);cnt[i]--;}
            v[a].clear();v[b].clear();
            for(auto i:x){
                v[a].push_back(i);
                v[b].push_back(i);
                cnt[i]+=2;
            }
        }else if(s=='C'){
            int a;cin>>a;
            cout<<cnt[a]<<endl;
        }else{
            int a,b;cin>>a>>b;
            auto it = lower_bound(v[a].begin(),v[a].end(),b)-v[a].begin();
            if(it==v[a].size()||v[a][it]!=b)cout<<"no\n";
            else cout<<"yes\n";
        }
    }
    return 0;
    }
    for(int i = 1;i<=n;i++){
        pr[i] = ++NODES , gs[i] = 1;
    }
    for(int i = 1;i<=n;i++){
        int tm = ++NODES;
        update(tm,pr[i],1,n,i);
        pr[i]=tm;
    }
    q+=n-1;
    while(q--){
        char c;cin>>c;
        if(c=='S'){int a,b;cin>>a>>b;merg(a,b);}
        else{
            int a,b;cin>>a>>b;
            cout<<(query(pr[a],1,n,b)?"yes\n":"no\n");
        }
    }
}

Compilation message (stderr)

servers.cpp: In function 'int main()':
servers.cpp:71:18: warning: comparison of integer expressions of different signedness: 'long int' and 'std::vector<int>::size_type' {aka 'long unsigned int'} [-Wsign-compare]
   71 |             if(it==v[a].size()||v[a][it]!=b)cout<<"no\n";
      |                ~~^~~~~~~~~~~~~
servers.cpp: In function 'void merg(int, int)':
servers.cpp:41:10: warning: 'tm' may be used uninitialized in this function [-Wmaybe-uninitialized]
   41 |     pr[a]=tm,pr[b]=tm,gs[b]+=gs[a],gs[a]=gs[b];
      |     ~~~~~^~~
#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...