珂朵莉树模板题,根据输入维护区间,perform需要做的是统计连续没有被占用的区间长度

struct ODT {
    std::map<i32,i32> mp;
    ODT(i32 l, i32 r,i32 v=-1) {
        mp[l]=v;
        mp[r+1]=v;
    }
    auto split(i32 pos) {
        auto it=std::prev(mp.upper_bound(pos));
        return mp.insert(it,std::make_pair(pos,it->second));
    }
    void assign(i32 l,i32 r,i32 v) {
        auto it=split(l);
        split(r);
        while (it->first!=r) {
            it=mp.erase(it);
        }
        mp[l]=v;
    }
    i32 perform(i32 l,i32 r) {
        auto it=split(l);
        split(r);
        i32 ans=0;
        i32 tm=0;
        i32 prev=-1;
        i32 pre=-1;
        while (true) {
            if (~pre) {
                if (~prev) {
                    tm+=it->first-pre;
                    ans=std::max(ans,tm);
                }else {
                    tm=0;
                }
            }
            pre=it->first;
            prev=it->second;
            if (it->first==r) {
                break;
            }
            it=std::next(it);
        }
        return ans;
    }
};
void solve(){
    i32 n,m;
    cin>>n>>m;
    ODT odt(1,n,0);
    while (m--) {
        i32 l,r;
        cin>>l>>r;
        odt.assign(l,r+1,-1);
    }
    std::cout<<odt.perform(0,n+1);
}