代码

2 条评论

  • @ 2025-8-21 16:25:35
    #include<bits/stdc++.h>
    using namespace std;
    const int N = 1000005;
    int val[N], dat[N], son[N][2], siz[N], rt;
    int base_min, mn, leave_count;
    
    void split(int p, int x, int &l, int &r) {
        if (!p) { l = r = 0; return; }
        if (val[p] <= x) {
            l = p;
            split(son[p][1], x, son[p][1], r);
        } else {
            r = p;
            split(son[p][0], x, l, son[p][0]);
        }
        siz[p] = siz[son[p][0]] + siz[son[p][1]] + 1;
    }
    
    int merge(int l, int r) {
        if (!l || !r) return l + r;
        if (dat[l] > dat[r]) {
            son[l][1] = merge(son[l][1], r);
            siz[l] = siz[son[l][0]] + siz[son[l][1]] + 1;
            return l;
        } else {
            son[r][0] = merge(l, son[r][0]);
            siz[r] = siz[son[r][0]] + siz[son[r][1]] + 1;
            return r;
        }
    }
    
    void insert(int x) {
        static int idx = 0;
        int l, r;
        split(rt, x, l, r);
        val[++idx] = x;
        dat[idx] = rand();
        siz[idx] = 1;
        rt = merge(merge(l, idx), r);
    }
    
    int kth(int p, int k) {
        if (k == siz[son[p][0]] + 1) return p;
        if (k <= siz[son[p][0]]) return kth(son[p][0], k);
        return kth(son[p][1], k - siz[son[p][0]] - 1);
    }
    
    int main() {
        srand(time(NULL));
        int n;
        cin >> n >> base_min;
        mn = 0;
        leave_count = 0;
        while(n--) {
            char op;
            int k;
            cin >> op >> k;
            if (op == 'I') {
                if (k >= base_min) {
                    insert(k - mn);
                }
            } else if (op == 'A') {
                mn += k;
            } else if (op == 'S') {
                mn -= k;
                int threshold = base_min - mn;
                int l, r;
                split(rt, threshold - 1, l, r);
                leave_count += siz[l];
                rt = r;
            } else if (op == 'F') {
                int total = siz[rt];
                if (k > total || k < 1) {
                    cout << -1 << '\n';
                } else {
                    int real_k = total - k + 1;
                    int node = kth(rt, real_k);
                    cout << val[node] + mn << '\n';
                }
            }
        }
        cout << leave_count << endl;
        return 0;
    }
    
    • @ 2025-8-21 16:21:00
      while(n--) {
              char op;
              int k;
              cin >> op >> k;
              if (op == 'I') {
                  if (k >= base_min) {
                      insert(k - mn);
                  }
              } else if (op == 'A') {
                  mn += k;
              } else if (op == 'S') {
                  mn -= k;
                  int threshold = base_min - mn;
                  int l, r;
                  split(rt, threshold - 1, l, r);
                  leave_count += siz[l];
                  rt = r;
              } else if (op == 'F') {
                  int total = siz[rt];
                  if (k > total || k < 1) {
                      cout << -1 << '\n';
                  } else {
                      int real_k = total - k + 1;
                      int node = kth(rt, real_k);
                      cout << val[node] + mn << '\n';
                  }
              }
          }
          cout << leave_count << endl;
      
      • 1