mrlolthe1st

Untitled

Oct 1st, 2023 (edited)
1,016
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 5.50 KB | None | 0 0
  1. #define _CRT_SECURE_NO_WARNINGS
  2. #include <assert.h>
  3.  
  4. #include <algorithm>
  5. #include <array>
  6. #include <string_view>
  7. #include <bitset>
  8. #include <chrono>
  9. #include <fstream>
  10. #include <functional>
  11. #include <iomanip>
  12. #include <variant>
  13. #include <iostream>
  14. #include <map>
  15. #include <numeric>
  16. #include <optional>
  17. #include <queue>
  18. #include <random>
  19. #include <set>
  20. #include <sstream>
  21. #include <string>
  22. #include <thread>
  23. #include <unordered_map>
  24. #include <unordered_set>
  25. #include <variant>
  26. #include <vector>
  27.  
  28. using namespace std;
  29. const int MAXN = 3e6;
  30. struct /*__attribute__((__packed__))*/ node {
  31.     int l, r, sz;
  32.     uint32_t rk;
  33.     char lit;
  34. };
  35. mt19937 gen(345678);
  36. node nodes[MAXN];
  37. int cid = 0;
  38. int next() {
  39.     int r = ++cid;
  40.     if (r == MAXN) exit(-1);
  41.     nodes[r].rk = gen();
  42.     return r;
  43. }
  44.  
  45. void upd(int v) {
  46.     if (!v) return;
  47.     nodes[v].sz = 1 + (nodes[v].l ? nodes[nodes[v].l].sz : 0) +
  48.         (nodes[v].r ? nodes[nodes[v].r].sz : 0);
  49. }
  50.  
  51. inline int cnt(int v) {
  52.     if (!v) return 0;
  53.     return nodes[v].sz;
  54. }
  55.  
  56. int merge(int l, int r) {
  57.     if (!l) return r;
  58.     if (!r) return l;
  59.     if (nodes[l].rk > nodes[r].rk) {
  60.         nodes[l].r = merge(nodes[l].r, r);
  61.         upd(l);
  62.         return l;
  63.     }
  64.     else {
  65.         nodes[r].l = merge(l, nodes[r].l);
  66.         upd(r);
  67.         return r;
  68.     }
  69. }
  70.  
  71. pair<int, int> split(int p, int x) {
  72.     if (!p) return { 0, 0 };
  73.     if (cnt(nodes[p].l) < x) {
  74.         auto [l, r] = split(nodes[p].r, x - cnt(nodes[p].l) - 1);
  75.         nodes[p].r = l;
  76.         upd(p);
  77.         return { p, r };
  78.     }
  79.     else {
  80.         auto [l, r] = split(nodes[p].l, x);
  81.         nodes[p].l = r;
  82.         upd(p);
  83.         return { l, p };
  84.     }
  85. }
  86.  
  87. void append(int& t, int it) { t = merge(t, it); }
  88.  
  89. int insert(const string& l, const string& r) {
  90.     int ll = 0, rr = 0;
  91.     if (l.size() == 1) {
  92.         ll = next();
  93.         nodes[ll].sz = 1;
  94.         nodes[ll].lit = l[0];
  95.     }
  96.     if (r.size() == 1) {
  97.         rr = next();
  98.         nodes[rr].sz = 1;
  99.         nodes[rr].lit = r[0];
  100.     }
  101.     if (!ll && !rr) return merge(insert(l.substr(0, l.size() / 2), l.substr(l.size() / 2)), insert(r.substr(0, r.size() / 2), r.substr(r.size() / 2)));
  102.     if (!rr && r.size()) return merge(ll, insert(r.substr(0, r.size() / 2), r.substr(r.size() / 2)));
  103.     if (!ll && l.size()) return merge(insert(l.substr(0, l.size() / 2), l.substr(l.size() / 2)), rr);
  104.     return merge(ll, rr);
  105. }
  106.  
  107. void print(stringstream& s, int t) {
  108.     if (!t) return;
  109.     print(s, nodes[t].l);
  110.     s << nodes[t].lit;
  111.     print(s, nodes[t].r);
  112. }
  113.  
  114. void print(string& s, int t) {
  115.     stringstream ss;
  116.     print(ss, t);
  117.     ss.flush();
  118.     s = ss.str();
  119. }
  120.  
  121. void insert(int& t, const string& s) {
  122.     t = merge(t, insert(s.substr(0, s.size() / 2), s.substr(s.size() / 2)));
  123. }
  124.  
  125. int K = 400;
  126. int vnum = 0;
  127. vector<string> ans(K);
  128. vector<vector<vector<int>>> changes(2 * K);
  129. vector<vector<vector<char>>> changes_i(2 * K);
  130. vector<vector<vector<int>>> changes_int(2 * K);
  131. vector<vector<vector<string>>> changes_str(2 * K);
  132. signed main(int argc, char** argv) {
  133.     int L, Q;
  134.     string S;
  135.     cin >> L >> Q >> S;
  136.     int deco = 0;
  137.     insert(deco, S);
  138.     ans[0] = S;
  139.     int processed = 0;
  140.     int cnt1 = 1;
  141.     int vnum = 1;
  142.     while (Q--) {
  143.         string t;
  144.         cin >> t;
  145.         if (t == "GET") {
  146.             int v, l, r;
  147.             cin >> v >> l >> r;
  148.             --v;
  149.             int p = v / K;
  150.             int off = v % K;
  151.             --off;
  152.             auto& block = changes[p];
  153.             auto& block_str = changes_str[p];
  154.             auto& block_int = changes_int[p];
  155.             auto& block_i = changes_i[p];
  156.             for (int j = l; j <= r; ++j) {
  157.                 int cpos = j;
  158.                 int curr_off = off;
  159.                 while (curr_off > -1) {
  160.                     auto& cur_chng = block[curr_off];
  161.                     auto& cur_chng_i = block_i[curr_off];
  162.                     auto& cur_chng_int = block_int[curr_off];
  163.                     auto& cur_chng_str = block_str[curr_off];
  164.                     auto x = upper_bound(cur_chng.begin(), cur_chng.end(), cpos);
  165.                     --x;
  166.                     int idx = x - cur_chng.begin();
  167.                     if (cur_chng_i[idx]) {
  168.                         cout << cur_chng_str[idx][cpos - cur_chng[idx]];
  169.                         break;
  170.                     }
  171.                     else {
  172.                         cpos = cur_chng_int[idx] + cpos - cur_chng[idx];
  173.                         --curr_off;
  174.                     }
  175.                 }
  176.                 if (curr_off == -1) {
  177.                     cout << ans[p][cpos - 1];
  178.                 }
  179.             }
  180.             cout << endl;
  181.         }
  182.         else if (t == "COMMIT") {
  183.             ++processed;
  184.             int c;
  185.             cin >> c;
  186.             int new_treap = 0;
  187.             int copy = deco;
  188.             int removed = 0;
  189.             int curr_idx = 1;
  190.             vector<int> changes_;
  191.             vector<char> changes_i_;
  192.             vector<int> changes_int_;
  193.             vector<string> changes_str_;
  194.             changes_.reserve(c);
  195.             changes_int_.reserve(c);
  196.             changes_i_.reserve(c);
  197.             changes_str_.reserve(c);
  198.             while (c--) {
  199.                 string t;
  200.                 cin >> t;
  201.                 if (t == "add") {
  202.                     cin >> t;
  203.                     insert(new_treap, t);
  204.                     changes_.push_back(curr_idx);
  205.                     curr_idx += t.size();
  206.                     changes_str_.emplace_back(std::move(t));
  207.                     changes_i_.push_back(1);
  208.                     changes_int_.push_back(0);
  209.                 }
  210.                 else {
  211.                     int l, r;
  212.                     cin >> l >> r;
  213.                     auto [a, b] = split(copy, l - 1 - removed);
  214.                     auto [c, d] = split(b, r - l + 1);
  215.                     new_treap = merge(new_treap, c);
  216.                     removed = r;
  217.                     copy = d;
  218.                     changes_.push_back(curr_idx);
  219.                     changes_str_.emplace_back();
  220.                     changes_i_.push_back(0);
  221.                     changes_int_.push_back(l);
  222.                     curr_idx += r - l + 1;
  223.                 }
  224.             }
  225.             changes[cnt1 - 1].emplace_back(std::move(changes_));
  226.             changes_str[cnt1 - 1].emplace_back(std::move(changes_str_));
  227.             changes_int[cnt1 - 1].emplace_back(std::move(changes_int_));
  228.             changes_i[cnt1 - 1].emplace_back(std::move(changes_i_));
  229.             deco = new_treap;
  230.             cout << "version " << ++vnum << std::endl;
  231.             if (processed == K - 1) {
  232.                 print(ans[cnt1++], deco);
  233.                 processed = 0;
  234.             }
  235.         }
  236.         else if (t == "FLUSH") {
  237.             cout << "===" << std::endl;
  238.         }
  239.     }
  240. }
Advertisement
Add Comment
Please, Sign In to add comment