Submission #516343

#TimeUsernameProblemLanguageResultExecution timeMemory
516343Be_dosCollider (IZhO11_collider)C++17
100 / 100
157 ms49508 KiB
#include <iostream>
#include <cmath>
#include <cctype>
#include <vector>
#include <algorithm>
#include <set>
#include <map>
#include <deque>
#include <stack>
#include <unordered_set>
#include <sstream>
#include <cstring>
#include <iomanip>
#include <queue>
#include <unordered_map>
#include <random>
#include <cfloat>
#include <chrono>
#include <bitset>
#include <complex>
#include <immintrin.h>
#include <cassert>

std::mt19937 rng;
struct Node {
    Node* left = nullptr, *right = nullptr;
    int32_t priority;
    int32_t subtree_size = 1;
    char val;

    Node(char val_) {
        priority = rng() % 10'000'000;
        val = val_;
    }
};

int32_t get_subtree_size(Node* node) {
    if(node == nullptr)
        return 0;
    return node->subtree_size;
}

void recalc(Node* node) {
    node->subtree_size = 1 + get_subtree_size(node->left) + get_subtree_size(node->right);
}

Node* get_by_ind(Node* node, int32_t ind) {
    if(ind == get_subtree_size(node->left))
        return node;
    if(ind < get_subtree_size(node->left))
        return get_by_ind(node->left, ind);
    return get_by_ind(node->right, ind - get_subtree_size(node->left) - 1);
}

std::pair<Node*, Node*> split(Node* node, int32_t left) {
    if(node == nullptr)
        return {nullptr, nullptr};
    if(left <= get_subtree_size(node->left)) {
        std::pair<Node*, Node*> res = split(node->left, left);
        node->left = res.second;
        recalc(node);
        return {res.first, node};
    } else {
        std::pair<Node*, Node*> res = split(node->right, left - get_subtree_size(node->left) - 1);
        node->right = res.first;
        recalc(node);
        return {node, res.second};
    }
}

Node* merge(Node* node1, Node* node2) {
    if(node1 == nullptr)
        return node2;
    if(node2 == nullptr)
        return node1;
    if(node1->priority < node2->priority) {
        node1->right = merge(node1->right, node2);
        recalc(node1);
        return node1;
    } else {
        node2->left = merge(node1, node2->left);
        recalc(node2);
        return node2;
    }
}

int main() {
    std::ios::sync_with_stdio(false);
    std::cin.tie(0);

    int32_t n, num_q;
    std::cin >> n >> num_q;

    std::string str;
    std::cin >> str;

    Node* root = nullptr;
    for(int32_t i = 0; i < n; i++)
        root = merge(root, new Node(str[i]));

    for(int32_t q = 0; q < num_q; q++) {
        char type;
        std::cin >> type;

        if(type == 'a') {
            int32_t ind1, ind2;
            std::cin >> ind1 >> ind2;
            ind1--;
            ind2--;

            if(ind1 == ind2)
                continue;

            if(ind2 > ind1) {
                std::pair<Node*, Node*> parts = split(root, ind1);
                std::pair<Node*, Node*> parts2 = split(parts.second, 1);
                std::pair<Node*, Node*> parts3 = split(parts2.second, ind2 - ind1);
                root = merge(parts.first, merge(parts3.first, merge(parts2.first, parts3.second)));
            } else {
                std::pair<Node*, Node*> parts = split(root, ind1);
                std::pair<Node*, Node*> parts2 = split(parts.second, 1);
                std::pair<Node*, Node*> parts3 = split(parts.first, ind2);
                root = merge(parts3.first, merge(parts2.first, merge(parts3.second, parts2.second)));
            }
        } else {
            int32_t ind;
            std::cin >> ind;
            ind--;

            std::cout << get_by_ind(root, ind)->val << "\n";
        }
    }
    return 0;
}
         
         
#Verdict Execution timeMemoryGrader output
Fetching results...