RT。
我线段树开了四倍数组,RE。
然后开了八倍数组,AC。
Why?
这是代码,我觉得我写的没那么逆天啊??
#include<bits/stdc++.h>
#define ffor(i,a,b) for(int i=(a);i<=(b);i++)
#define roff(i,a,b) for(int i=(a);i>=(b);i--)
using namespace std;
const int MAXN=2e5+10;
int n,m,mx[MAXN<<2];
multiset<int> st[MAXN<<2];
#define lson (k<<1)
#define rson (k<<1|1)
#define mid (l+r>>1)
int calc(int k) {
if(st[k].size()==0) return -1;
return *(--st[k].end());
}
void insert(int k,int l,int r,int x,int y,int v) {
if(x<=l&&r<=y) return st[k].insert(v),mx[k]=max(mx[k],v),void();
if(x<=mid) insert(lson,l,mid,x,y,v);
if(y>mid) insert(rson,mid+1,r,x,y,v);
mx[k]=max({mx[lson],mx[rson],calc(k)});
return ;
}
void del(int k,int l,int r,int x,int y,int v) {
if(mx[k]<v) return ;
if(calc(k)==v) {
st[k].erase(st[k].find(v));
if(l<x) insert(k,l,r,l,x-1,v);
if(y<r) insert(k,l,r,y+1,r,v);
mx[k]=max({mx[lson],mx[rson],calc(k)});
return ;
}
if(x<=mid) del(lson,l,mid,x,y,v);
if(y>mid) del(rson,mid+1,r,x,y,v);
mx[k]=max({mx[lson],mx[rson],calc(k)});
return ;
}
int query(int k,int l,int r,int x,int y) {
int ans=calc(k);
if(x<=l&&r<=y) return max(ans,mx[k]);
if(y<=mid) return max(ans,query(lson,l,mid,x,y));
if(x>mid) return max(ans,query(rson,mid+1,r,x,y));
return max({ans,query(lson,l,mid,x,y),query(rson,mid+1,r,x,y)});
}
int main() {
ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
memset(mx,-1,sizeof(mx));
cin>>n>>m;
ffor(i,1,m) {
int op,l,r,v;
cin>>op>>l>>r;
if(op==1) cin>>v,insert(1,1,n,l,r,v);
if(op==3) {
v=query(1,1,n,l,r);
cout<<v<<'\n';
}
if(op==2) {
v=query(1,1,n,l,r);
if(v!=-1) del(1,1,n,l,r,v);
}
}
return 0;
}