RT,貌似是修改出了问题,其他地方可能也有问题,求大佬帮忙看看。
#include<bits/stdc++.h>
#include<ext/rope>
#include<ext/pb_ds/assoc_container.hpp>
#include<ext/pb_ds/tree_policy.hpp>
#define MAXN 50010
#define lson now << 1
#define rson now << 1 | 1
using namespace std;
using namespace __gnu_cxx;
using namespace __gnu_pbds;
typedef tree<int, null_type, less<int>, rb_tree_tag, tree_order_statistics_node_update> rb_tree;
struct node{
int l, r;
rb_tree tr;
};
node sgt[MAXN << 2];
int n, m;
int a[MAXN];
void build(int now, int l, int r){
sgt[now].l = l; sgt[now].r = r;
for(int i = l; i <= r; i++) sgt[now].tr.insert(a[i]);
if(l == r) return ;
int mid = (l + r) >> 1;
build(lson, l, mid); build(rson, mid + 1, r);
}
void update(int now, int pos, int val){
sgt[now].tr.erase(a[pos]); sgt[now].tr.erase(val);
if(sgt[now].l == sgt[now].r) return ;
int mid = (sgt[now].l + sgt[now].r) >> 1;
if(pos <= mid) update(lson, pos, val);
else update(rson, pos, val);
}
int query_order(int now, int l, int r, int k){
if(sgt[now].l > r || sgt[now].r < l) return 0;
if(sgt[now].l >= l && sgt[now].r <= r) return sgt[now].tr.order_of_key(k) + 1;
else return query_order(lson, l, r, k) + query_order(rson, l, r, k);
}
int query_value(int l, int r, int k){
int lb = 0, rb = 1e8, res = 1e8;
while(lb <= rb){
int mid = (lb + rb) >> 1;
if(query_order(1, l, r, mid) < k) lb = mid + 1;
else rb = mid - 1, res = mid;
}
return res;
}
int query_pre(int now, int l, int r, int k){
if(sgt[now].l > r || sgt[now].r < l) return -2147483647;
if(sgt[now].l >= l && sgt[now].r <= r) return *(--sgt[now].tr.lower_bound(k));
else return max(query_pre(lson, l, r, k), query_pre(rson, l, r, k));
}
int query_nxt(int now, int l, int r, int k){
if(sgt[now].l > r || sgt[now].r < l) return 2147483647;
if(sgt[now].l >= l && sgt[now].r <= r) return *sgt[now].tr.upper_bound(k);
else return min(query_nxt(lson, l, r, k), query_nxt(rson, l, r, k));
}
int main(){
scanf("%d%d",&n,&m);
for(int i = 1; i <= n; i++) scanf("%d",&a[i]);
build(1, 1, n);
for(int i = 1; i <= m; i++){
int op, l, r, k, pos;
scanf("%d",&op);
if(op == 1){
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",query_order(1, l, r, k));
}else if(op == 2){
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",query_value(l, r, k));
}else if(op == 3){
scanf("%d%d",&pos,&k);
update(1, pos, k);
}else if(op == 4){
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",query_pre(1, l, r, k));
}else if(op == 5){
scanf("%d%d%d",&l,&r,&k);
printf("%d\n",query_nxt(1, l, r, k));
}
}
return 0;
}