Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- ll sz(node *&t) {
- return getCnt(t);
- }
- void un(node *&t, int ind) {
- auto[left, r] = split(t, ind);
- auto[mid, right] = split(r, 2);
- auto[f, s] = split(mid, 1);
- auto nw = new node(getSum(f) + getSum(s));
- t = merge(merge(left, nw), right);
- }
- void sp(node *&t, int ind, ll cnt) {
- auto[left, r] = split(t, ind);
- auto[mid, right] = split(r, 1);
- auto nw1 = new node(cnt);
- auto nw2 = new node(getSum(mid) - cnt);
- t = merge(merge(merge(left, nw1), nw2), right);
- }
- void res(node *&t, int ind, ll cnt) {
- auto[left, r] = split(t, ind);
- auto[mid, right] = split(r, 1);
- auto nw = new node(cnt);
- t = merge(merge(left, nw), right);
- }
- ll gc(node *&t, int cnt) {
- auto[left, right] = split(t, cnt);
- ll res = getCnt(left);
- t = merge(left, right);
- return res;
- }
- void solve() {
- int n;
- std::cin >> n >> m;
- node *t = nullptr;
- for (int i = 0; i < n; ++i) {
- int x;
- std::cin >> x;
- t = merge(t, new node(x));
- }
- int q;
- std::cin >> q;
- for (int i = 0; i < q; ++i) {
- std::string qs;
- std::cin >> qs;
- if (qs == "size") {
- std::cout << sz(t) << '\n';
- } else if (qs == "chapter") {
- // бинпоиск
- ll cnt;
- std::cin >> cnt;
- int left = 0, right = getSz(t);
- while (right - left > 1) {
- int mid = (left + right) / 2;
- if (gc(t, mid) < cnt) {
- left = mid;
- } else {
- right = mid;
- }
- }
- std::cout << left + 1 << '\n';
- } else if (qs == "union") {
- int ind;
- std::cin >> ind;
- un(t, ind - 1);
- } else if (qs == "split") {
- int ind;
- ll cnt;
- std::cin >> ind >> cnt;
- sp(t, ind - 1, cnt);
- } else if (qs == "resize") {
- int ind;
- ll cnt;
- std::cin >> ind >> cnt;
- res(t, ind - 1, cnt);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement