제출 #312632

#제출 시각아이디문제언어결과실행 시간메모리
312632giorgikobInterval Collection (CCO20_day2problem2)C++14
25 / 25
4626 ms290896 KiB
#include<bits/stdc++.h>
#define ll long long
#define ff first
#define ss second
#define pb push_back
using namespace std;

const int N = 1e6+5;

struct bla{
    bla *left = NULL, *right = NULL;
    int answer = 1e9;
    int l = -1e9;
    int r = 1e9;
};


multiset<int>b[N],e[N],L,R;


inline void upd(bla* &node,int tl,int tr,int pos,bool ok){

    if(tl == tr){
        if(!ok){
            if(e[tl].size()){
                node->l = *e[tl].rbegin();
            } else {
                node->l = -1e9;
            }
        } else {
            if(b[tr].size()){
                node->r = *b[tr].begin();
            } else {
                node->r = 1e9;
            }
        }
        node->answer = node->r - node->l;
        return ;
    }

    int mid = tl + tr; mid >>= 1;

    if(node->left == NULL)node->left = new bla();
    if(node->right == NULL)node->right = new bla();

    if(pos <= mid){
        upd(node->left,tl,mid,pos,ok);
    } else {
        upd(node->right,mid+1,tr,pos,ok);
    }

    node->l = max(node->left->l,node->right->l);
    node->r = min(node->left->r,node->right->r);

    node->answer = node->right->r - node->left->l;
    node->answer = min(node->answer, min(node->left->answer, node->right->answer));
}

int main(){
    ios :: sync_with_stdio(0); cin.tie(0); cout.tie(0);

    bla* root = new bla();

    int q;
    cin >> q;
    while(q--){
        char c;
        int l,r;
        cin >> c >> l >> r;
        if(c == 'A'){
            b[l].insert(r);
            e[r].insert(l);
            L.insert(l);
            R.insert(r);
        } else {
            b[l].erase(b[l].find(r));
            e[r].erase(e[r].find(l));
            L.erase(L.find(l));
            R.erase(R.find(r));
        }


        upd(root,1,N-1,l,1);
        upd(root,1,N-1,r,0);

        int x = *L.rbegin();
        int y = *R.begin();
        if(x < y){
            cout << (*b[x].begin() - *e[y].rbegin()) << endl;
        } else {
            //cout << "second : ";
            cout << root->answer << endl;
        }
    }
}

#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...