Cod sursa(job #3344955)

Utilizator ioanxhIoan Budeanu ioanxh Data 7 martie 2026 09:41:23
Problema Secv8 Scor 100
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 3.19 kb
#include<bits/stdc++.h>
#define nl '\n'
using namespace std;
const string file="secv8";
ifstream f(file+".in");
ofstream g(file+".out");
//#define f cin
//#define g cout
mt19937 rnd(chrono::steady_clock::now().time_since_epoch().count());
struct node {
    node *l,*r;
    int val,prior,sz;
    bool rev;
    node(int x) {
        l=r=NULL;
        val=x;
        sz=1;
        prior=rnd();
        rev=false;
    }
};
struct treap {
    node *root;
    treap() {
        root=NULL;
    }
    int getsz(node *nod) {
        return nod?nod->sz:0;
    }
    void upd(node *nod) {
        if (!nod) return;
        nod->sz=1+getsz(nod->l)+getsz(nod->r);
    }
    void push(node *nod) {
        if (!nod || !nod->rev) return;
        swap(nod->l,nod->r);
        if (nod->l) nod->l->rev^=1;
        if (nod->r) nod->r->rev^=1;
        nod->rev=false;
    }
    pair<node*,node*>split(node *nod, int k) {
        if (nod==NULL) return {NULL,NULL};
        push(nod);
        if (getsz(nod->l)>=k) {
            pair<node*,node*>p=split(nod->l,k);
            nod->l=p.second;
            upd(nod);
            return {p.first,nod};
        }
        pair<node*,node*>p=split(nod->r,k-getsz(nod->l)-1);
        nod->r=p.first;
        upd(nod);
        return {nod,p.second};
    }
    node* merge(node *a, node *b) {
        if (!a || !b) return a?a:b;
        if (a->prior>b->prior) {
            push(a);
            a->r=merge(a->r,b);
            upd(a);
            return a;
        }
        push(b);
        b->l=merge(a,b->l);
        upd(b);
        return b;
    }
    void insert(int poz, int x) {
        auto p=split(root,poz-1);
        root=merge(merge(p.first,new node(x)),p.second);
    }
    int kth(node *nod,int poz) {
        while (nod) {
            push(nod);
            int st=getsz(nod->l);
            if (poz<st) nod=nod->l;
            else if (poz==st) return nod->val;
            else {
                poz-=st+1;
                nod=nod->r;
            }
        }
        return -1;
    }
    void erase(int poz) {
        auto p=split(root,poz);
        auto q=split(p.second,1);
        root=merge(p.first,q.second);
    }
    void erase(int st, int dr) {
        auto p=split(root,st-1);
        auto q=split(p.second,dr-st+1);
        root=merge(p.first,q.second);
    }
    void reverse(int st, int dr) {
        auto p=split(root,st-1);
        auto q=split(p.second,dr-st+1);
        if (q.first) q.first->rev^=1;
        root=merge(p.first,merge(q.first,q.second));
    }
    void inorder(node *nod) {
        if (!nod) return;
        push(nod);
        inorder(nod->l);
        g<<nod->val<<" ";
        inorder(nod->r);
    }
}t;
int q,n;
int main(){
    f>>q>>n;
    while (q--) {
        char op;
        f>>op;
        if (op=='I') {
            int poz,val;
            f>>poz>>val;
            t.insert(poz,val);
        }
        else if (op=='A') {
            int poz;
            f>>poz;
            g<<t.kth(t.root,poz-1)<<nl;
        }
        else if (op=='R') {
            int st,dr;
            f>>st>>dr;
            t.reverse(st,dr);
        }
        else {
            int st,dr;
            f>>st>>dr;
            t.erase(st,dr);
        }
    }
    t.inorder(t.root);
    system("pause");
    return 0;
}