逻辑写的有点混乱。
int n,q,a[200010],l[200010],r[200010],x[200010];
struct tnode
{
int l,r;
multiset<int>tag;
tnode(){}
tnode(int _l,int _r,multiset<int> _tag)
{
l=_l,r=_r,tag=_tag;
}
};
struct segtree
{
tnode t[800010];
void pushup(int rt)
{
;
}
void pushdown(int rt)
{
// if(!t[rt].tag.size())return;
// int x=*t[rt].tag.rbegin();
// t[ls].tag.insert(x);
// t[rs].tag.insert(x);
// t[rt].tag.erase(t[rt].tag.end());
}
void build(int rt,int l,int r)
{
t[rt].l=l,t[rt].r=r;
if(l==r)
{
return;
}
int mid=l+r>>1;
build(ls,l,mid);
build(rs,mid+1,r);
pushup(rt);
}
void update(int rt,int l,int r,int x)
{
if(t[rt].l==l&&t[rt].r==r)
{
t[rt].tag.insert(x);
return;
}
pushdown(rt);
if(r<=t[ls].r)update(ls,l,r,x);
else if(l>=t[rs].l)update(rs,l,r,x);
else update(ls,l,t[ls].r,x),update(rs,t[rs].l,r,x);
pushup(rt);
return;
}
void undo(int rt,int l,int r,int x)
{
if(t[rt].l==l&&t[rt].r==r)
{
t[rt].tag.erase(t[rt].tag.find(x));
return;
}
pushdown(rt);
if(r<=t[ls].r)undo(ls,l,r,x);
else if(l>=t[rs].l)undo(rs,l,r,x);
else undo(ls,l,t[ls].r,x),undo(rs,t[rs].l,r,x);
pushup(rt);
return;
}
int query(int rt,int id)
{
if(t[rt].l==id&&t[rt].r==id)
{
return (t[rt].tag.size()?(*t[rt].tag.begin()):0);
}
pushdown(rt);
int ans=0;
if(id<=t[ls].r)ans=query(ls,id);
else if(id>=t[rs].l)ans=query(rs,id);
chmax(ans,(t[rt].tag.size()?(*t[rt].tag.begin()):0));
return ans;
}
}sgt;
void main_solve(int test_id)
{
cin>>n;
for(int i=1;i<=n;i++)cin>>a[i];
sgt.build(1,1,n);
cin>>q;
for(int i=1;i<=q;i++)
{
int op;
cin>>op;
if(op==1)
{
cin>>l[i]>>r[i]>>x[i];
sgt.update(1,l[i],r[i],x[i]);
}
else if(op==2)
{
int id;
cin>>id;
sgt.undo(1,l[id],r[id],x[id]);
}
else
{
int id;
cin>>id;
int l=sgt.query(1,id);
cout<<max(a[id],l)<<endl;
}
}
return;
}