답안 #224762

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
224762 2020-04-18T18:16:01 Z brcode 케이크 (CEOI14_cake) C++14
0 / 100
1384 ms 13816 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<<rev[curr]<<endl;
                for(int i=val;i>=max(n-rev[curr],ub);i--){
                    //cout<<123<<" "<<ranks[i]<<" "<<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(n-rev[curr],ub)+1;i<=val;i++){
                    ranks[i-1] = ranks[i];
                    rev[ranks[i-1]] = i-1;
                    //cout<<(i-1)<<" "<<ranks[i-1]<<endl;
                }
                
                ranks[val] = curr;
                rev[curr] = val;
            
            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 Incorrect 5 ms 384 KB Output isn't correct
2 Halted 0 ms 0 KB -
# 결과 실행 시간 메모리 Grader output
1 Incorrect 662 ms 4856 KB Output isn't correct
2 Incorrect 677 ms 4960 KB Output isn't correct
3 Incorrect 662 ms 5032 KB Output isn't correct
4 Correct 694 ms 4984 KB Output is correct
5 Incorrect 688 ms 5532 KB Output isn't correct
6 Incorrect 765 ms 5800 KB Output isn't correct
7 Incorrect 715 ms 5672 KB Output isn't correct
8 Correct 754 ms 5880 KB Output is correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 335 ms 3576 KB Output isn't correct
2 Incorrect 326 ms 3684 KB Output isn't correct
3 Incorrect 321 ms 3448 KB Output isn't correct
4 Incorrect 5 ms 384 KB Output isn't correct
5 Incorrect 418 ms 7160 KB Output isn't correct
6 Incorrect 417 ms 7288 KB Output isn't correct
7 Incorrect 428 ms 6904 KB Output isn't correct
# 결과 실행 시간 메모리 Grader output
1 Incorrect 110 ms 632 KB Output isn't correct
2 Incorrect 119 ms 888 KB Output isn't correct
3 Incorrect 207 ms 2552 KB Output isn't correct
4 Incorrect 208 ms 2680 KB Output isn't correct
5 Incorrect 312 ms 1272 KB Output isn't correct
6 Incorrect 391 ms 3960 KB Output isn't correct
7 Incorrect 440 ms 2680 KB Output isn't correct
8 Incorrect 381 ms 5112 KB Output isn't correct
9 Incorrect 1384 ms 12884 KB Output isn't correct
10 Incorrect 1037 ms 4860 KB Output isn't correct
11 Incorrect 1104 ms 6520 KB Output isn't correct
12 Incorrect 1272 ms 12024 KB Output isn't correct
13 Incorrect 1235 ms 13816 KB Output isn't correct