Cod sursa(job #3251121)

Utilizator CReaper1116Shang Cheng Lin CReaper1116 Data 25 octombrie 2024 00:17:26
Problema Secv8 Scor 25
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.73 kb
#include<bits/stdc++.h>
#define cin fin
#define cout fout
using namespace std;
ifstream fin("secv8.in");
ofstream fout("secv8.out");
const int N = 25e4;
const int mod = 998244353;
int r = 0;
struct treapnode{
    int y,sz;
    int val;
    bool lz;
    treapnode* l;
    treapnode* r;
};
int rng(int x){
    r = (1ll*r*123 + 7)%mod;
    return r%x;
}
void upd(treapnode* &p){
    p->sz = (p->l?p->l->sz:0) + (p->r?p->r->sz:0) + 1;
}
int get(treapnode* &p){
    return (p?p->sz:0);
}
void push(treapnode* &p){
    if(!p)return;
    if(p->lz){
        p->lz^=1;
        swap(p->l,p->r);
        if(p->l)p->l->lz^=1;
        if(p->r)p->r->lz^=1;
    }
}
void merger(treapnode* a, treapnode* b, treapnode* &t){
    push(a);
    push(b);
    if(!a || !b){
        t = (a?a:b);
    }else if(a->y < b->y){
        merger(a, b->l, b->l);
        t = b;
    }else{
        merger(a->r, b, a->r);
        t = a;
    }
    upd(t);
}
void spliter(treapnode* &l, treapnode* &r, treapnode* t, int key, int sum = 0){
    push(t);
    if(!t){
        l = r = NULL;
    }else{
        if(sum + get(t->l) < key){
            spliter(t->r, r, t->r, key, sum + get(t->l) + 1);
            l = t;
        }else{
            spliter(l, t->l, t->l, key, sum);
            r = t;
        }
        upd(t);
    }
}
void dbg(treapnode* &t){
    if(!t)return;
    dbg(t->l);
    cout<<t->val<<' ';
    dbg(t->r);
}
int finder(treapnode* &t, int nr){
    push(t);
    if(!t)return -1;
    if(get(t->l) == nr){
        return t->val;
    }else if(get(t->l) > nr){
        return finder(t->l, nr);
    }else{
        return finder(t->r, nr - get(t->l) - 1);
    }
}
treapnode v[N];
treapnode *p1,*p2,*p3;
int main(){
    int n,t;
    int cnt = 0;
    cin>>n>>t;
    for(int i = 0;i < n;i++){
        char x;
        cin>>x;
        if(x == 'I'){
            int a,b;
            cin>>a>>b;
            a--;
            v[cnt++] = {rng(mod),1,b,0,nullptr,nullptr};
            spliter(p1, p2, p1, a);
            merger(p1,&v[cnt - 1], p1);
            merger(p1, p2, p1);
        }else if(x == 'D'){
            int l,r;
            cin>>l>>r;
            l--;r--;
            spliter(p1, p2, p1, l);
            spliter(p2, p3, p2, r - l + 1);
            merger(p1, p3, p1);
        }else if(x == 'A'){
            int p;
            cin>>p;
            p--;
            cout<<finder(p1, p)<<'\n';
        }else if(x == 'R'){
            int l,r;
            cin>>l>>r;
            l--;r--;
            spliter(p1, p2, p1, l);
            spliter(p2, p3, p2, r - l + 1);
            p2->lz^=1;
            merger(p1, p2, p1);
            merger(p1, p3, p1);
        }
    }
    dbg(p1);
    return 0;
}