线段树分裂合并爆零求助大佬
查看原帖
线段树分裂合并爆零求助大佬
610557
shinzanmonoszm 妹妹楼主2023/7/8 01:14
#include<iostream>
#include<algorithm>
#include<set>
const int sz=1e5+10;
struct ST{
    struct node{
        int lson,rson,val;
    }tree[sz<<7];
    int num=0;
    void add(int&p,int ln,int rn,int pos,int val){
        if(p==0)p=++num;
        tree[p].val+=val;
        if(ln==rn)return;
        int mid=ln+rn>>1;
        if(pos<=mid)add(tree[p].lson,ln,mid,pos,val);
        else add(tree[p].rson,mid+1,rn,pos,val);
    }
    int merge(int x,int y){
        if(x==0||y==0)return x+y;
        tree[x].val+=tree[y].val;
        tree[x].lson=merge(tree[x].lson,tree[y].lson);
        tree[x].rson=merge(tree[x].rson,tree[y].rson);
        return x;
    }
    void split(int x,int &y,int k,bool up){
        if(x==0)return;
        y=++num;
        tree[y].val=tree[x].val-k;
        tree[x].val=k;
        if(up){
            int lsz=tree[tree[x].lson].val;
            if(lsz<k)split(tree[x].rson,tree[y].rson,k-lsz,up);
            else std::swap(tree[x].rson,tree[y].rson);
            if(lsz>k)split(tree[x].lson,tree[y].lson,k,up);
        }else{
            int rsz=tree[tree[x].rson].val;
            if(rsz<k)split(tree[x].lson,tree[y].lson,k-rsz,up);
            else std::swap(tree[x].lson,tree[y].lson);
            if(rsz>k)split(tree[x].rson,tree[y].rson,k,up);
        }
    }
    int query(int p,int ln,int rn,int k){
        if(ln==rn)return tree[p].val;
        int mid=ln+rn>>1;
        if(k<=tree[tree[p].lson].val)return query(tree[p].lson,ln,mid,k);
        return query(tree[p].rson,mid+1,rn,tree[tree[p].lson].val);
    }
}st;
struct node{
    mutable int l,r,root;
    mutable bool up;
    bool operator<(const node&a)const{
        return l<a.l;
    }
};
int n,q;
std::set<node>arr;
auto split(int x){
    auto it=--arr.upper_bound(node{x,0,0,false});
    if(it->l==x)return it;
    auto res=arr.insert(node{x,it->r,0,false}).first;
    it->r=x-1;
    st.split(it->root,res->root,x-it->l,it->up);
    return res;
}
int main(){
    std::ios::sync_with_stdio(false);
    std::cin.tie(nullptr);
    std::cin>>n>>q;
    for(int i=1,x;i<=n;i++){
        std::cin>>x;
        int rt=0;
        st.add(rt,1,n,x,1);
        arr.insert(node{i,i,rt,true});
    }
    while(q--){
        int op,l,r;
        std::cin>>op>>l>>r;
        auto itr=split(r+1),itl=split(l);
        auto citl=itl;
        citl->up=op==0,++itl;
        for(auto it=itl;it!=itr;++it)
            citl->root=st.merge(citl->root,it->root);
        arr.erase(itl,itr);
    }
    int x;
    std::cin>>x;
    auto it=split(x-1);
    std::cout<<st.query(it->root,1,n,1)<<"\n";
    return 0;
}
2023/7/8 01:14
加载中...