Cod sursa(job #2525449)

Utilizator Stefan_PiscuPiscu Stefan Constantin Stefan_Piscu Data 17 ianuarie 2020 13:06:31
Problema Secv8 Scor 0
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.77 kb
#include <bits/stdc++.h>
using namespace std;

ifstream fin("secv8.in");
ofstream fout("secv8.out");

class TreapVector{
  private:

    struct Node{
        Node *ls, *rs;
        int val;
        int pri;
        int cnt;
        bool rev;
        Node(){
            ls=rs=NULL,
            val=0,
            cnt=0,
            rev=0,
            pri=rand()||(rand()<<31);
        }
    };

    Node *root;

    void push (Node *root){
        if (root&&root->rev){
            root->rev=0;
            swap(root->ls,root->rs);
            if(root->ls) root->ls->rev^=1;
            if(root->rs) root->rs->rev^=1;
    }
}

    int cnt(Node *root){
        return root?root->cnt:0;
    }

    void upd(Node *root){
        if(root) root->cnt=1+cnt(root->ls)+cnt(root->rs);
    }

    void join(Node *&root, Node *l, Node *r){
        push(l), push(r);
        if(!l||!r) root=l?l:r;
        else if(l->pri>r->pri){
            join(l->rs, l->rs, r);
            root=l;
        }
        else{
            join(r->ls, l, r->ls);
            root=r;
        }
        upd(root);
    }

    void split(Node *root, Node *&l, Node *&r, int poz){
        if(!root){
            l=r=NULL;
        }
        else if(cnt(root->ls)>=poz){
            push(root);
            split(root->ls, l, root->ls, poz);
            r=root;
        }
        else{
            push(root);
            split(root->rs, root->rs, r, poz-cnt(root->ls)-1);
            l=root;
        }
        upd(root);
    }

    void auxshow(Node *root){
        if(!root) return;
        push(root);
        auxshow(root->ls);
        fout<<root->val<<" ";
        auxshow(root->rs);
    }

    void insert(Node *&root, Node *a, int poz){
        push(root);
        Node *p1, *p2;
        split(root, p1, p2, poz-1);
        join(p1, p1, a);
        join(root, p1, p2);
    }

    void erase(Node *&root, int lp, int rp){
        Node *p1, *p2, *p3;
        split(root, p1, p2, lp);
        split(p2, p2, p3, rp-lp+1);
        join(root, p1, p3);
    }

    void reverse(Node *&root, int lp, int rp){
        Node *p1, *p2, *p3;
        split(root, p1, p2, lp);
        split(p2, p2, p3, rp-lp+1);
        p2->rev^=1;
        join(root, p1, p2);
        join(root, root, p3);
    }

    int get(Node *&root, int poz){
        if(!root) return -1;
        int nr=cnt(root->ls);
        if(nr==poz-1){
            return root->val;
        }
        if(nr>=poz){
            return get(root->ls, poz);
        }
        else{
            return get(root->rs, poz-nr-1);
        }
    }

  public:
    void add(int x, int poz){
        Node *a=new Node;
        a->val=x;
        insert(root, a, poz);
    }

    void show(){
        if(!root) return;
        push(root);
        auxshow(root->ls);
        fout<<root->val<<" ";
        auxshow(root->rs);
        fout<<"\n";
    }

    void del(int poz){
        erase(root, poz-1, poz-1);
    }

    void del(int i, int j){
        erase(root, i-1, j-1);
    }

    int get(int poz){
        return get(root, poz);
    }

    void reverse(int l, int r){
        reverse(root, l-1, r-1);
    }

};

TreapVector v;

int main()
{
    int n, trash;
    fin>>n>>trash;
    while(n--){
        char t;
        fin>>t;
        if(t=='I'){
            int k, e;
            fin>>k>>e;
            v.add(e, k);
        }
        else if(t=='A'){
            int k;
            fin>>k;
            fout<<v.get(k)<<"\n";
        }
        else if(t=='R'){
            int i, j;
            fin>>i>>j;
            v.reverse(i, j);
        }
        else{
            int i, j;
            fin>>i>>j;
            v.del(i, j);
        }
    }v.show();
    return 0;
}