#include<bits/stdc++.h>
using namespace std;
const int N = 1e5+7;
struct A{
int x,id;
bool operator<(const A& p)const{
return x < p.x;
}
};
struct node{
int l,r,x;
void init(){
l = 0,r = 0,x= 0;
}
};
int idx[N],root[N];
A num[N];
node pt[N*19];
int tot = 0;
void insert(int &now,int pre,int x,int l,int r){
now = ++tot;
pt[now].init();
if(l == r){
pt[now].x = 1;
return ;
}
int mid = l+r>>1;
pt[now] = pt[pre];
if(mid >= x) insert(pt[now].l,pt[pre].l,x,l,mid);
else insert(pt[now].r,pt[pre].r,x,mid+1,r);
pt[now].x = pt[pt[now].l].x+pt[pt[now].r].x;
}
int check(int now,int pre,int x,int l,int r){
//cout << l << ' '<< r << ' ' << x << endl;
if(l == r){
return l;
}
int mid = l+r>>1;
if(x > pt[pt[now].l].x - pt[pt[pre].l].x){
return check(pt[now].r,pt[pre].r,x-pt[pt[now].l].x + pt[pt[pre].l].x,mid+1,r);
}
else return check(pt[now].l,pt[pre].l,x,l,mid);
}
int main(){
int n,m;
int T;
cin >> T;
while(T--){
tot=0;
cin >>n >> m;
for(int i = 1;i <= n;i ++){
scanf("%d",&num[i].x);
num[i].id = i;
}
sort(num+1,num+1+n);
for(int i = 1;i <= n;i ++){
idx[num[i].id] = i;
}
for(int i = 1;i <= n;i ++){
insert(root[i],root[i-1],idx[i],1,n);//将第i个数插入主席树
}
int R,L;
int ans = check(root[R],root[L-1],k,1,n);//返回L,R之间第k大的是第几个数。
}
return 0;
}
主席树区间第k大;非严格第k大
最新推荐文章于 2021-08-11 11:43:06 发布