제출 #1351532

#제출 시각아이디문제언어결과실행 시간메모리
1351532WarinchaiSpecijacija (COCI20_specijacija)C++20
0 / 110
12 ms2004 KiB
#include<bits/stdc++.h>
#define int long long
using namespace std;

int p[1005][1005];
int a[1005];
int n,q,t;

pair<int,int> lca(int x,int lx,int y,int ly){
    if(lx<ly){
        swap(x,y);
        swap(lx,ly);
    }
    for(int i=19;i>=0;i--){
        if(lx-(1<<i)>=ly)lx-=(1<<i);
    }
    //cerr<<"do:\n";
    //cerr<<x<<" "<<lx<<" "<<y<<" "<<ly<<"\n";
    if(p[lx][x]==p[ly][y])return {x,lx};
    for(int i=19;i>=0;i--){
        if(lx-(1<<i)>0){
            if(p[lx-(1<<i)][x]!=p[ly-(1<<i)][y]){
                lx=lx-(1<<i),ly=ly-(1<<i);
            }
        }
    }
    //cerr<<"fin:";
    //cerr<<x<<" "<<lx<<"\n";
    return {x,lx-1};
}

int32_t main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin>>n>>q>>t;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    for(int i=1;i<=n+1;i++)p[n+1][i]=i;
    for(int i=n;i>=1;i--){
        int x=a[i]-(i*(i-1)/2);
        int pos=upper_bound(p[i+1]+1,p[i+1]+2+n,x)-p[i+1];
        for(int j=1;j<=n+1;j++)p[i][j]=p[i+1][j];
        for(int j=pos;j<=n+1;j++)p[i][j]--;
    }
    int prv=0;
    int md=(n+1)*(n+2)/2;
    vector<int>st;
    for(int i=1;i<=n+1;i++){
        st.push_back(i*(i-1)/2+1);
    }
    /*cerr<<"\n\n";
    for(auto x:st)cerr<<x<<" ";
    cerr<<"\n\n";
    for(int i=1;i<=n+1;i++){
        for(int j=1;j<=n+1;j++){
            cerr<<p[i][j]<<" ";
        }
        cerr<<"\n";
    }
    cerr<<"\n";*/
    for(int i=0;i<q;i++){
        //cerr<<"i:"<<i<<"\n";
        int x,y;cin>>x>>y;
        x=(x-1+t*prv)%(md)+1;
        y=(y-1+t*prv)%(md)+1;
        int lx=upper_bound(st.begin(),st.end(),x)-st.begin();
        int ly=upper_bound(st.begin(),st.end(),y)-st.begin();
        //cerr<<"ly:"<<ly<<"\n";
        x-=(lx*(lx-1)/2);
        y-=(ly*(ly-1)/2);
        x=lower_bound(p[lx]+1,p[lx]+n+2,x)-p[lx];
        y=lower_bound(p[ly]+1,p[ly]+n+2,y)-p[ly];
        auto ans=lca(x,lx,y,ly);
        //cerr<<x<<" "<<lx<<" "<<y<<" "<<ly<<"\n";
        //cerr<<"ans:"<<ans.first<<" "<<ans.second<<"\n";
        int rans=p[ans.second][ans.first]+ans.second*(ans.second-1)/2;
        cout<<rans<<"\n";
        prv=rans;
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...