답안 #523210

# 제출 시각 아이디 문제 언어 결과 실행 시간 메모리
523210 2022-02-07T08:02:20 Z RaresFelix 입자 가속기 (IZhO11_collider) C++17
0 / 100
1 ms 328 KB
#include <bits/stdc++.h>
#define MN 1007171
#define INF 1000000000
using namespace std;

struct nod {
    char v;
    int c, p;
    nod *l, *r;
} *nil = new nod{0, 0, 0, 0, 0};

using ns = nod *;

struct pns {
    ns l, r;
};

ns mod_fiu(ns b, int s, ns f) {
    (s ? b->r : b->l) = f;
    b->c = 1 + b->l->c + b->r->c;
    return b;
}

ns join(ns a, ns b) {
    return a == nil ? b :
           b == nil ? a :
           (a->p > b->p) ? mod_fiu(a, 1, join(a->r, b)) :
           mod_fiu(b, 0, join(a, b->l));
}

pns split(ns a, int nr) {
    pns t;
    return a == nil ? pns{nil, nil} :
           (a->c <= nr) ? pns{a, nil} :
           !nr ? pns{nil, a} :
           (a->l->c >= nr) ? (t = split(a->l, nr), t.r = mod_fiu(a, 0, t.r), t) :
           (t = split(a->r, nr - a->l->c - 1), t.l = mod_fiu(a, 1, t.l), t);
}

void afis(ns a) {
    if(a == nil) return;
    afis(a->l);
    cout << a->v;
    afis(a->r);
}

ns root = nil;
int n, m;
char C[MN];
int main() {
    srand(time(0));
    cin >> n >> m >> (C+1);
    for(int i = 1; i <= n; ++i)
        root = join(root, new nod{C[i], 1, rand(), nil, nil});
    char tip;
    for(int i = 1, l, r; i <= m; ++i) {
        cin >> tip;
        if(tip == 'a') {
            cin >> l >> r;
            pns a = split(root, l - 1), b = split(a.r, 1);
            root = join(a.l, b.r);
            ns el = b.l;
            a = split(root, r - (r > l) - 1);
            root = join(join(a.l, el), a.r);
        } else {
            cin >> l;
            pns a = split(root, l-1), b = split(a.r, 1);
            cout << b.l->v << "\n";
            root = join(a.l, join(b.l, b.r));
        }
//        cout << "\n";
//        afis(root);
//        cout << "\n";
    }
}
# 결과 실행 시간 메모리 Grader output
1 Incorrect 1 ms 328 KB Output isn't correct
2 Halted 0 ms 0 KB -