제출 #1153554

#제출 시각아이디문제언어결과실행 시간메모리
1153554m5588ohammedQueue (CEOI06_queue)C++20
100 / 100
497 ms38032 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define endl "\n"
vector <array<int,2>> query1,query2;
vector <int> act,qu;
map <int,int> pos,vis,f,b,fw,bw,mp;
int n,q;
void ins(int x){
    if(vis[x]==0) act.push_back(x);
    vis[x]=1;
    return;
}
void build(){
    sort(act.begin(),act.end());
    for(int i=0;i<act.size();i++){
        //cout<<act[i]<<" ";
        pos[act[i]]=act[i];
        if(i!=0){
            f[act[i]]=act[i-1];
            fw[act[i]]=act[i]-act[i-1]-1;
        }
        else{
            b[0]=act[i];
            fw[act[i]]=bw[0]=act[i]-1;
        }
        if(i!=act.size()-1){
            b[act[i]]=act[i+1];
            bw[act[i]]=act[i+1]-act[i]-1;
        }
        else{
          bw[act[i]]=fw[1e9+1]=1e9-act[i];
          b[act[i]]=1e9+1;
        }
    }
    for(auto [A,B]:query1){
        int BACK=b[A],FRONT=f[A];
        b[FRONT]=BACK;
        f[BACK]=FRONT;
        bw[FRONT]=fw[BACK]=bw[A]+fw[A];
        FRONT=f[B];
        b[FRONT]=A;
        f[A]=FRONT;
        b[A]=B;
        f[B]=A;
        fw[A]=bw[FRONT];
        bw[A]=fw[B]=0;
    }
    int bg=b[0],sum=bw[0],idx=0;
    while(bg!=1e9+1){
        qu.push_back(bg);
        pos[bg]=sum+1;
        mp[sum+1]=bg;
        sum+=bw[bg]+1;
        bg=b[bg];
    }
    return;
}
int order(int i){
    int l=0,r=qu.size()-1,j=i;
    while(l<=r){
        int mid=(l+r)/2;
        if(pos[qu[mid]]<=i){
            j=i-(mid+1);
            l=mid+1;
        }
        else r=mid-1;
    }
    return j;
}
int calc(int i){
    int l=1,r=1e9,ans=0;
    while(l<=r){
        int mid=(l+r)/2;
        if(mid-(upper_bound(act.begin(),act.end(),mid)-act.begin())>=i){
            ans=mid;
            r=mid-1;
        } 
        else l=mid+1;   
    }
    return ans;
}
signed main(){
    cin>>n;
    for(int i=0;i<n;i++){
        int a,b;
        cin>>a>>b;
        query1.push_back({a,b});
        ins(a);
        ins(b);
    }
    cin>>q;
    for(int i=0;i<q;i++){
        char c;
        int x;
        cin>>c>>x;
        if(c=='L') query2.push_back({1,x});
        else{
            query2.push_back({2,x});
            ins(x);
        }
    }
    build();
    for(auto [a,b]:query2){
        if(a==2) cout<<pos[b]<<endl;
        else{
            if(mp[b]!=0) cout<<mp[b]<<endl;
            else{
                cout<<calc(order(b))<<endl;
            }
        }
    }
}  
#Verdict Execution timeMemoryGrader output
Fetching results...