第k大
每个节点表示数值,而不是表示区间
Code#include#include #include #include using namespace std; typedef long long ll; const int N = 1e6 + 10; int n,q,a[N]; #define lc (p<<1) #define rc (p<<1|1) struct Node{ int l,r,sum; }tr[N<<2]; void build(int p,int l,int r){ tr[p] = {l,r,0}; if(l == r){ return; } int mid = (l+r) >> 1; build(lc,l,mid); build(rc,mid+1,r); } void push_up(int p){ tr[p].sum = tr[lc].sum + tr[rc].sum; } void update(int p,int val,int v){ if(tr[p].l == tr[p].r){ tr[p].sum+=v; return; } int mid = (tr[p].l + tr[p].r) >> 1; if(val<=mid){ update(lc,val,v); }else update(rc,val,v); push_up(p); } int query(int p,int k){ if(tr[p].l == tr[p].r) return tr[p].l; int mid = (tr[p].l + tr[p].r) >> 1; if(tr[lc].sum>=k) return query(lc,k); else return query(rc,k-tr[lc].sum); } int main(){ std::ios::sync_with_stdio(false),cin.tie(0),cout.tie(0); cin >> n >> q; build(1,1,N); for(int i=1;i<=n;++i){ cin >> a[i]; update(1,a[i],1); } int op,x,y,k; while(q--){ cin >> op; if(op == 1){ cin >> k; cout << query(1,k) << 'n'; }else{ cin >> x >> y; update(1,a[x],-1); a[x] = y; update(1,y,1); } } return 0; }



