Cod sursa(job #2410560)

Utilizator CharacterMeCharacter Me CharacterMe Data 20 aprilie 2019 10:39:23
Problema Lista lui Andrei Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.6 kb
#include <iostream>
#include <fstream>
#include <cstdio>
#include <climits>
using namespace std;
ifstream fin("zeap.in");
ofstream fout("zeap.out");
char Q1[20];
struct Pair{
    char c;
    int long long val;
};
struct Str{
    int long long mn, mx;
    int long long l, r;
    int long long val;
};
Pair Order[300001];
int long long List[300001], Poz[300001], Inv[300001], Size;
bool Check[300001];
int V, P, i;
class BTree{
    Str Vct[1200001];
    Str Calc(Str A, Str B){
        Str C;
        if(A.l==0 && B.l==0){C.l=C.r=C.mn=C.mx=0; C.val=LONG_MAX;}
        else if(A.l==0) C=B;
        else if(B.l==0) C=A;
        else{
            C.l=A.l; C.r=B.r;
            C.mn=min(A.mn, B.mn); C.mx=max(A.mx, B.mx);
            C.val=min(min(A.val, B.val), max(A.r, B.l)-min(A.r, B.l));
        }
        return C;
    }
    void Change(int long long val, int target, int a, int b, int position){
        int mid=(a+b)/2;
        if(a==b) {Vct[position].l=Vct[position].r=Vct[position].mn=Vct[position].mx=val; Vct[position].val=LONG_MAX; return;}
        if(target<=mid) Change(val, target, a, mid, 2*position);
        else Change(val, target, mid+1, b, 2*position+1);
        Vct[position]=Calc(Vct[2*position], Vct[2*position+1]);
        return;
    }
public:
    void Set(int long long val, int target){
        Change(val, target, 1, P, 1);
        return;
    }
    void Max(){
        fout<<Vct[1].mx-Vct[1].mn<<"\n";
        return;
    }
    void Min(){
        fout<<Vct[1].val<<"\n";
        return;
    }
};
BTree Arb;
void QSort(int S, int D);
int Arrange(int S, int D);
int BS(int S, int D, int val);
int main()
{
    while(fin.getline(Q1, 20)){
        if(Q1[0]=='I' || Q1[0]=='S' || Q1[0]=='C'){
            int i=2, nr=0;
            while(Q1[i]>='0' && Q1[i]<='9') {nr=nr*10+(Q1[i]-'0'); ++i;}
            Order[++V].c=Q1[0]; Order[V].val=nr;
        }
        else if(Q1[0]=='M'){
            if(Q1[2]=='X') Order[++V].c='X';
            else Order[++V].c='N';
        }
    }
    for(i=1; i<=V; ++i) if(Order[i].c=='I'){List[++P]=Order[i].val; Poz[i]=P; Inv[P]=i;}
    QSort(1, P); int p=0;
    for(i=1; i<=V; ++i){
        if(Order[i].c=='I') {Arb.Set(Order[i].val, Poz[Inv[++p]]); Check[Poz[Inv[p]]]=true; ++Size;}
        else if(Order[i].c=='S'){
            int x=BS(1, P, Order[i].val);
            if(x==0) fout<<"-1\n";
            else {
               if(Check[x]==false) fout<<"-1\n";
               else{
                  Arb.Set(0, x); Check[x]=false; --Size;
               }
            }
        }
        else if(Order[i].c=='C'){
            int x=BS(1, P, Order[i].val);
            if(x==0) fout<<"0\n";
            else{
                if(Check[x]==false) fout<<"0\n";
                else fout<<"1\n";
            }
        }
        else if(Order[i].c=='X') {if(Size<2)fout<<"-1\n"; else Arb.Max();}
        else {if(Size<2)fout<<"-1\n"; else Arb.Min();}
    }
    return 0;
}
void QSort(int S, int D){
    if(S<D){
        int p=Arrange(S, D);
        QSort(S, p-1);
        QSort(p+1, D);
    }
    return;
}
int Arrange(int S, int D){
    int pS=0, pD=1;
    while(S<D){
        if(List[S]>List[D]){
            swap(List[S], List[D]);
            swap(Poz[Inv[S]], Poz[Inv[D]]);
            swap(pS, pD);
        }
        S+=pS;
        D-=pD;
    }
    return S;
}
int BS(int S, int D, int val){
    int mid=(S+D)/2;
    if(S==D && List[S]!=val) return 0;
    if(val==List[mid]) return mid;
    if(val<List[mid]) return BS(S, mid, val);
    if(val>List[mid]) return BS(mid+1, D, val);
    return 0;
}