struct stree{
int t[400005],tag[400005];
inline void push_up(int p){
t[p>>1]=max(t[p>>1],t[p]);
}
inline void push_down(int p){
t[p<<1]=max(t[p<<1],tag[p]);
tag[p<<1]=max(tag[p<<1],tag[p]);
t[p<<1|1]=max(t[p<<1|1],tag[p]);
tag[p<<1|1]=max(tag[p<<1|1],tag[p]);
}
void update(int p,int l,int r,int x,int y,int v){
if(r<x||l>y)return ;
if(x<=l&&y>=r){
t[p]=max(t[p],v);
tag[p]=max(tag[p],v);
return ;
}
int mid=(l+r)/2;
push_down(p);
update(p<<1,l,mid,x,y,v);
update(p<<1|1,mid+1,r,x,y,v);
push_up(p);
}
int query(int p,int l,int r,int v){
if(l==r)return t[p];
int mid=(l+r)/2;
push_down(p);
if(v<=mid)return query(p<<1,l,mid,v);
else return query(p<<1|1,mid+1,r,v);
}
}st;