MnZn 求助,pb_ds 好像除了什么诡异的错误
查看原帖
MnZn 求助,pb_ds 好像除了什么诡异的错误
547908
NightTide楼主2022/10/2 19:44

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;
}
2022/10/2 19:44
加载中...