Cod sursa(job #3232217)

Utilizator puica2018Puica Andrei puica2018 Data 29 mai 2024 11:48:08
Problema Secv8 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.14 kb
#include <bits/stdc++.h>

using namespace std;

class Treap
{
public:

    int key;
    int prior;
    int sz;
    int val;

    bool rev;

    Treap *L;
    Treap *R;

    Treap(int _key,int _val)
    {
        key=_key;
        prior=rand()%1000000;
        sz=1;
        val=_val;

        rev=0;

        L=R=NULL;
    }
};

int sz(Treap *T)
{
    if(T==NULL)
        return 0;
    return T->sz;
}

void UpdateSz(Treap *T)
{
    T->sz=1+sz(T->L)+sz(T->R);
}

void UpdateKey(Treap *T,int add)
{
    T->key=add+1+sz(T->L);
}

void Merge(Treap *T,Treap *a,Treap *b,int add)
{
    Treap *aux=T;

    if(a==NULL || b==NULL)
    {
        T=(a!=NULL?a:b);
    }
    else
    {
        int v1=a->prior;
        int v2=b->prior;

        if(v1>v2)
        {
            Merge(a->R,a->R,b);
            T=a;
        }
        else
        {
            Merge(b->L,a,b->L);
            T=b;
        }
    }

    delete aux;
}

void Split(Treap *T,int x,Treap *l,Treap *r,int add)
{
    if(T==NULL)
    {
        l=r=NULL;
    }
    else
    {
        Treap *aux=T;

        int v=T->key;

        if(x<v)
        {
            Split(T->L,x,l,r);
            Merge(r,r,T->R);
        }
        else
        {
            Split(T->R,x,l,r);
            Merge(l,T->L,l);
        }

        delete aux;
    }
}

void Insert(Treap *T,Treap *t,int add)
{
    if(T==NULL)
    {
        T=t;
    }
    else
    {
        if(T->prior<t->prior)
        {
            Split(T,t->key,t->L,t->R);
            T=t;
        }
        else
        {
            if(T->key>t->key)
                Insert(T->L,t);
            else
                Insert(T->R,t);
        }
    }
}

int F(Treap *T,int x,int add)
{
    if(T!=NULL)
    {
        if(T->key==x)
            return T->val;
        if(x<T->key)
            return F(T->L,x);
        return F(T->R,x);
    }
    return -1;
}

void Erase(Treap *T,int i,int j)
{
    Treap *T1,*T2,*T3;

    Split(T,i,T1,T2);
    Split(T2,j-i+2,T2,T3);

    delete T2;

    Merge(T,T1,T3);
}

int main()
{

    return 0;
}