#include<bits/stdc++.h>usingnamespace std;constint N =1e5+10;
vector<int> num;int n,m;int a[N];int root[N],idx;structnode{int l,r;int cnt;}tr[N*21];intfind(int x){returnlower_bound(num.begin(),num.end(),x)- num.begin();}intbuild(int l,int r){int p =++idx;if(l == r)return p;int mid = l + r >>1;
tr[p].l =build(l,mid), tr[p].r =build(mid+1,r);return p;}intinsert(int p,int l,int r,int x){int q =++idx;
tr[q]= tr[p];if(l == r){
tr[q].cnt++;return q;}int mid = l + r >>1;if(x <= mid) tr[q].l =insert(tr[p].l,l,mid,x);else tr[q].r =insert(tr[p].r,mid+1,r,x);
tr[q].cnt = tr[tr[q].l].cnt + tr[tr[q].r].cnt;return q;}intquery(int p,int q,int l,int r,int k){if(l == r)return l;int mid = l + r >>1;int cnt = tr[tr[p].l].cnt - tr[tr[q].l].cnt;if(k <= cnt)returnquery(tr[p].l,tr[q].l,l,mid,k);elsereturnquery(tr[p].r,tr[q].r,mid +1, r, k - cnt);}intmain(){
cin>>n>>m;for(int i =1; i <= n ; i ++){
cin>>a[i];
num.push_back(a[i]);}sort(num.begin(),num.end());
num.erase(unique(num.begin(),num.end()), num.end());
root[0]=build(0,num.size()-1);for(int i =1; i <= n ; i ++){
root[i]=insert(root[i-1],0,num.size()-1,find(a[i]));}while(m--){int l,r,k;
cin>>l>>r>>k;
cout<<num[query(root[r],root[l-1],0,num.size()-1,k)]<<"\n";}return0;}
第K大数
#include<iostream>#include<vector>#include<algorithm>usingnamespace std;#defineiosios::sync_with_stdio(false),cin.tie(0),cout.tie(0);#definefifirst#definesesecondtypedeflonglong ll;typedefunsignedlonglong ull;typedef pair<int,int> PII;typedef vector<int> VI;inline ll qmi(int a,int b,int p){ ll res =1% p;while(b){if(b &1) res = res * a % p; a = a *(ll)a % p; b >>=1;}return res;}inline ll qm(ll a, ll b){ ll res =1;while(b){if(b &1) res = res * a ; a = a *(ll)a ; b >>=1;}return res;}inline ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}inline ll lcm(ll x, ll y){return x /gcd(x, y)* y;}inline ll maxll(ll x, ll y){return x > y ? x : y;}inline ll minll(ll x, ll y){return x < y ? x : y;}constint mod=1000000007, N =1e5+10;structnode{int l,r,cnt;}tr[N*40];int root[N],idx;int n,m;
VI num;int a[N];intbuild(int l,int r){int u =++idx;if(l == r){return u;}int mid = l + r >>1;
tr[u].l =build(l,mid), tr[u].r =build(mid+1,r);return u;}intfind(int x){returnlower_bound(num.begin(),num.end(), x)- num.begin();}voidinsert(int&u,int p,int l,int r,int x){
u =++idx;
tr[u]= tr[p];
tr[u].cnt ++;if(l == r)return;int mid = l + r >>1;if(x <= mid)insert(tr[u].l,tr[p].l,l,mid,x);elseinsert(tr[u].r , tr[p].r , mid+1,r,x);}intquery(int p,int q,int l,int r,int x){if(l == r)return r;int cnt = tr[tr[p].r].cnt - tr[tr[q].r].cnt;int mid = l + r >>1;if(x > cnt)returnquery(tr[p].l,tr[q].l,l,mid,x-cnt);elsereturnquery(tr[p].r,tr[q].r,mid+1,r,x);}voidsolve(){
ios
cin>>n;
num.clear();
idx =0;for(int i =1; i <= n ; i ++) cin>>a[i],num.push_back(a[i]);
cin>>m;sort(num.begin(),num.end());
num.erase(unique(num.begin(), num.end()), num.end());
root[0]=build(0,num.size()-1);for(int i =1; i <= n ; i ++)insert(root[i],root[i-1],0,num.size()-1,find(a[i]));while( m --){int l,r,k;
cin>>l>>r>>k;
l ++, r ++;
cout<<num[query(root[r],root[l-1],0,num.size()-1,k)]<<"\n";}}intmain(){// int t;// cin>>t;// while(t--)// {solve();// }return0;}
区间小于或大于K的数的个数/和
constint mod=1000000007, N =2e5+10;int a[N];int n,m;int root[N],idx;structnode{int l,r;
ll sum,cnt;}tr[N*40];voidinsert(int&p,int u,int l,int r,int x){
p =++idx;
tr[p]= tr[u];
tr[p].cnt ++;
tr[p].sum += x;if(l == r){return;}int mid = l + r >>1;if(x <= mid)insert(tr[p].l,tr[u].l,l,mid,x);elseinsert(tr[p].r,tr[u].r,mid+1,r,x);return;}
ll query1(int p,int q,int l,int r,int lk,int rk){if(l >= lk && r <= rk)return tr[p].sum - tr[q].sum;int mid = l + r >>1;
ll sum =0;if(lk <= mid) sum +=query1(tr[p].l,tr[q].l,l,mid,lk,rk);if(rk > mid) sum +=query1(tr[p].r,tr[q].r,mid+1,r,lk,rk);return sum;}
ll query2(int p,int q,int l,int r,int lk,int rk,int k){if(l >= lk && r <= rk){return(ll)(tr[p].cnt - tr[q].cnt)*k -(tr[p].sum - tr[q].sum);}int mid = l + r >>1;
ll sum =0;if(lk <= mid) sum +=query2(tr[p].l,tr[q].l,l,mid,lk,rk,k);if(rk > mid) sum +=query2(tr[p].r,tr[q].r,mid+1,r,lk,rk,k);return sum;}voidsolve(){
cin>>n>>m;for(int i =1; i <= n ; i ++) cin>>a[i],num.push_back(a[i]);int len =1e9;for(int i =1; i <= n ; i ++)insert(root[i],root[i-1],0,len,a[i]);while(m --){int l,r,k;
cin>>l>>r>>k;
ll ans =0;
ans +=query1(root[r],root[l-1],0,len,0,k/2);
ans +=query2(root[r],root[l-1],0,len,k/2+1,k,k);
cout<<ans<<"\n";}}intmain(){solve();return0;}