Cod sursa(job #2462248)

Utilizator sebi110Ciobanu Sebastian sebi110 Data 26 septembrie 2019 22:07:13
Problema Zeap Scor 40
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 4.11 kb
#include<bits/stdc++.h>
#define inf 1e9
#define NMAX 100005
#define MOD 1000000007
using namespace std;

typedef long long ll;
struct treap{
    treap *left,*right;

    ll mi,ma,ansmi,ansma,val,pri;
    treap()
    {
        left=right=nullptr;
        ma=ansma=val=0;
        mi=ansmi=inf;
    }
    treap(int x)
    {
        left=right=nullptr;
        mi=ma=val=x;
        pri=rand();
        ansmi=inf;
        ansma=0;
    }
}*root;
void update(treap*act)
{
    if(act==nullptr)return ;
    act->mi=act->ma=act->val;
    act->ansmi=inf;
    act->ansma=0;
    if(act->left)
    {
        act->mi=min(act->mi,act->left->mi);
        act->ma=max(act->ma,act->left->ma);
        act->ansmi=min(act->ansmi,(act->val - act->left->ma));
        act->ansma=max(act->ansma,(act->val - act->left->mi));
        act->ansmi=min(act->ansmi,act->left->ansmi);
        act->ansma=max(act->ansma,act->left->ansma);
    }
    if(act->right)
    {
        act->mi=min(act->mi,act->right->mi);
        act->ma=max(act->ma,act->right->ma);
        act->ansmi=min(act->ansmi,(act->right->mi - act->val));
        act->ansma=max(act->ansma,(act->right->ma - act->val));
        act->ansmi=min(act->ansmi,act->right->ansmi);
        act->ansma=max(act->ansma,act->right->ansma);
    }
    if(act->left && act->right)
    {
        act->ansma=max(act->ansma,act->right->ma - act->left->mi);
    }
}
void split(treap *act, int key, treap*&left, treap*&right)
{
    if(act==nullptr)
    {
        left=right=nullptr;
        update(act);
        return ;
    }
    if(key<act->val)
    {
        split(act->left,key,left,act->left);
        right=act;
        update(act);
        return ;
    }
    split(act->right,key,act->right,right);
    left=act;
    update(act);
    return ;
}
void merg(treap *&act,treap *left, treap *right)
{
    if(left==nullptr || right==nullptr)
    {
        if(left==nullptr)
            act=right;
        else
            act=left;
        update(act);
        return ;
    }
    if(left->pri>right->pri)
    {
        merg(left->right,left->right,right);
        act=left;
        update(act);
        return ;
    }
    merg(right->left,left,right->left);
    act=right;
    update(act);
}
void inser(treap *&act,treap *elem)
{
    treap *left,*right;
    split(act,elem->val,left,right);
    merg(left,left,elem);
    merg(act,left,right);
}
void dele(treap *&act,treap *elem)
{
    treap *left,*right,*temp;
    split(act,elem->val,left,right);
    split(left,elem->val-1,left,temp);
    merg (act,left,right);//posibil sa nu fie bine
}
bool cauta(treap *&act,treap *elem)
{
    int ok=1;
    treap *left,*right,*temp;
    split(act,elem->val,left,right);
    split(left,elem->val-1,left,temp);
    if(temp==nullptr)
        ok=0;
    merg(left,left,temp);
    merg(act,left,right);
    return ok;
}
int main()
{
    treap *elem;
    int x;
    char s[100];
    srand(time(NULL));
    ios_base::sync_with_stdio(false);
    freopen("zeap.in","r",stdin);
    freopen("zeap.out","w",stdout);
    while(cin>>s)
    {
        if(s[0]=='I')
        {
            cin>>x;
            elem=new treap(x);
            if(cauta(root,elem))continue;
            if(root==nullptr)
            {
                root=elem;
            }
            else
                inser(root,elem);
            continue;
        }
        if(s[0]=='S')
        {
            cin>>x;
            elem=new treap(x);
            x=cauta(root,elem);
            if(x==0)
            {
                cout<<-1<<'\n';
                continue;
            }
            dele(root,elem);
            continue;
        }
        if(s[0]=='C')
        {
            cin>>x;
            elem=new treap(x);
            x=cauta(root,elem);
            cout<<x<<'\n';
            continue;
        }
        if(root==nullptr || root->ansma==0)
        {
            cout<<-1<<'\n';
            continue;
        }
        if(s[1]=='A')
            cout<<root->ansma<<'\n';
        else
            cout<<root->ansmi<<'\n';
    }
    return 0;
}