답안 #224774

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
224774 2020-04-18T18:53:11 Z brcode 케이크 (CEOI14_cake) C++14
0 / 100
1355 ms 10104 KB
#include <iostream>
#include <bits/stdc++.h>

using namespace std;
int n,k;
const int MAXN = 5e5+5;
pair<int,int> arr[MAXN];
int ranks[MAXN];
int rev[MAXN];
struct segmenttree{
    int seg[4*MAXN];
    void build(int curr,int l,int r){
        if(l==r){
            seg[curr] = rev[l];
            
            return;
        }
        int mid = (l+r)/2;
        build(2*curr,l,mid);
        build(2*curr+1,mid+1,r);
        seg[curr] = max(seg[2*curr],seg[2*curr+1]);
    }
    int query(int curr,int l,int r,int tl,int tr){
        if(l>tr||r<tl){
            return -1e9;
        }
        if(tl<=l && r<=tr){
            return seg[curr];
        }
        int mid = (l+r)/2;
        return max(query(2*curr,l,mid,tl,tr),query(2*curr+1,mid+1,r,tl,tr));
    }
    int lmost(int curr,int l,int r,int val){
        
        if(seg[curr]<val){
            return r+1;
        }
        if(l==r){
            return l;
        }
        int mid = (l+r)/2;
        if(seg[2*curr]>val){
            return lmost(2*curr,l,mid,val);
        }else if(seg[2*curr+1]>val){
            return lmost(2*curr+1,mid+1,r,val);
        }else{
            return r+1;
        }
    }
    int rmost(int curr,int l,int r,int val){
        if(seg[curr]<val){
            return l-1;
        }
        if(l==r){
            return l;
        }
        int mid = (l+r)/2;
        if(seg[2*curr+1]>val){
            return rmost(2*curr+1,mid+1,r,val);
        }else if(seg[2*curr]>val){
            return rmost(2*curr,l,mid,val);
        }else{
            return l-1;
        }
    }
    void update(int curr,int l,int r,int ind ,int val){
        if(l==r){
            seg[curr] = val;
            return;
        }
        int mid = (l+r)/2;
        if(ind<=mid){
            update(2*curr,l,mid,ind,val);
        }else{
            update(2*curr+1,mid+1,r,ind,val);
        }
        seg[curr] = max(seg[2*curr],seg[2*curr+1]);
    }
} segl,segr;

int main(){
    cin>>n>>k;
    for(int i=1;i<=n;i++){
        cin>>arr[i].first;
        arr[i].second = i;
    }
    sort(arr+1,arr+n+1);
    for(int i=1;i<=n;i++){
        ranks[i] = arr[i].second;
        rev[arr[i].second] = i;//what rank is ith position
    }
    if(k!=1){
        segl.build(1,1,k-1);
    }
    if(k!=n){
        segr.build(1,k+1,n);
    }
    int q;
    cin>>q;
    int ub = max(1,n-10);
    while(q--){
        char s;
        cin>>s;
        if(s=='F'){
            int x;
            cin>>x;
            if(x==k){
                cout<<0<<endl;
                continue;
            }
            if(x<k){
                int temp = segl.query(1,1,k-1,x,k-1);
                int temp2 = n+1;
                
                if(temp!=n){
                    temp2 = segr.lmost(1,k+1,n,temp);
                }
                //cout<<x<<" "<<temp2<<endl;
                cout<<temp2-x-1<<endl;
            }else{
                int temp = segr.query(1,k+1,n,k+1,x);
                int temp2 = 0;
               // cout<<123<<" "<<temp<<endl;
                if(temp!=n){
                    temp2 = segl.rmost(1,1,k-1,temp);
                }
               // cout<<123<<" "<<temp2<<endl;
                cout<<x-temp2-1<<endl;
                
            }
        }else{
            int curr,val;
            cin>>curr>>val;
            //cout<<curr<<" "<<val<<endl;
            val = n-val+1;
           // cout<<curr<<" "<<val<<endl;
           //cout<<1234<<" "<<curr<<" "<<val<<endl;
            //cout<<1234<<" "<<val<<" "<<rev[curr]<<endl;
                for(int i=val;i>max(ub,rev[curr]);i--){
                 //   cout<<123<<" "<<ranks[2]<<" "<<i-1<<endl;
                    //cout<<1234<<" "<<i<<" "<<ranks[i]<<" "<<min(rev[curr],min(10,n))<<endl;
                    if(ranks[i] == k){
                        continue;
                    }
                    if(ranks[i]<k){
                        segl.update(1,1,k-1,ranks[i],i-1);
                        
                    }else{
                        segr.update(1,k+1,n,ranks[i],i-1);
                    }
                    
                }
                for(int i=max(ub,rev[curr]+1);i<=val;i++){
                    
                    ranks[i-1] = ranks[i];
                    rev[ranks[i]] = i-1;
                    //cout<<(i-1)<<" "<<ranks[i-1]<<endl;
                }
                
                ranks[val] = curr;
                rev[curr] = val;
              //  cout<<endl;
          /* for(int i=1;i<=n;i++){
              //  cout<<rev[i]<<" ";
            }
           // cout<<endl;
            for(int i=1;i<=n;i++){
             //   cout<<ranks[i]<<" ";
            }*/
            //cout<<endl;
            if(curr==k){
                    continue;
                }
                if(curr<k){
                    segl.update(1,1,k-1,curr,val);
                }else{
                    segr.update(1,k+1,n,curr,val);
                }
                
        }
    }
}
# 결과 실행 시간 메모리 Grader output
1 Correct 4 ms 384 KB Output is correct
2 Incorrect 6 ms 384 KB Output isn't correct
3 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 498 ms 1504 KB Output isn't correct
2 Correct 426 ms 640 KB Output is correct
3 Incorrect 486 ms 1272 KB Output isn't correct
4 Correct 423 ms 640 KB Output is correct
5 Incorrect 530 ms 1784 KB Output isn't correct
6 Correct 518 ms 1656 KB Output is correct
7 Incorrect 528 ms 1788 KB Output isn't correct
8 Correct 451 ms 1152 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 335 ms 3576 KB Output isn't correct
2 Correct 320 ms 3448 KB Output is correct
3 Correct 317 ms 3320 KB Output is correct
4 Correct 4 ms 384 KB Output is correct
5 Incorrect 422 ms 7032 KB Output isn't correct
6 Incorrect 413 ms 7008 KB Output isn't correct
7 Correct 411 ms 6776 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 102 ms 632 KB Output isn't correct
2 Incorrect 109 ms 632 KB Output isn't correct
3 Incorrect 205 ms 2416 KB Output isn't correct
4 Incorrect 195 ms 2424 KB Output isn't correct
5 Incorrect 293 ms 1276 KB Output isn't correct
6 Incorrect 379 ms 3448 KB Output isn't correct
7 Incorrect 440 ms 2040 KB Output isn't correct
8 Incorrect 304 ms 3704 KB Output isn't correct
9 Incorrect 1355 ms 9084 KB Output isn't correct
10 Incorrect 994 ms 2504 KB Output isn't correct
11 Incorrect 1091 ms 3192 KB Output isn't correct
12 Incorrect 1315 ms 8228 KB Output isn't correct
13 Incorrect 1177 ms 10104 KB Output isn't correct