1 条题解

  • 0
    @ 2023-11-7 20:47:43
    #include <bits/stdc++.h>
    using namespace std;
    const int maxn = 2e5 + 5;
    int tr[maxn<<2], n, q;
    
    #define lson l, mid, rt<<1
    #define rson mid+1, r, rt<<1|1
    void push_up(int rt) {
    	tr[rt] = tr[rt<<1] + tr[rt<<1|1];
    }
    void update(int p, int l, int r, int rt) {
    	if (l == r) {
    		tr[rt] = 1;
    		return;
    	}
    	int mid = (l + r) / 2;
    	(p <= mid) ? update(p, lson) : update(p, rson);
    	push_up(rt);
    }
    int query(int L, int R, int l, int r, int rt) {
    	if (L <= l && r <= R)
    		return tr[rt];
    	int mid = (l + r) / 2, res = 0;
    	if (L <= mid) res += query(L, R, lson);
    	if (R > mid) res += query(L, R, rson);
    	return res;
    }
    int find(int L, int R, int k, int l, int r, int rt) {
    	if (l == r)
    		return l;
    	int mid = (l + r) / 2;
    	if (L <= mid) { // [l , mid]
    		int m = query(L, R, lson);
    		if (m >= k)
    			return find(L, R, k, lson);
    		return find(L, R, k-m, rson);
    	}
    	return find(L, R, k, rson);
    }
    int main() {
    	scanf("%d%d", &n, &q);
    	while (q--) {
    		int op;
    		scanf("%d", &op);
    		if (op == 1) {
    			int x;
    			scanf("%d", &x);
    			update(x, 1, n, 1);
    		}
    		else {
    			int l, r, k;
    			scanf("%d%d%d", &l, &r, &k);
    			printf("%d\n", find(l, r, k, 1, n, 1));
    		}
    	}
    	return 0;
    }
    
    • 1

    信息

    ID
    29
    时间
    1000ms
    内存
    256MiB
    难度
    10
    标签
    递交数
    6
    已通过
    2
    上传者