#include <iostream>
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define maxn 199999
using namespace std;
int num[maxn];
int segtree[maxn];
void plant(int node ,int l,int r)
{
if(l==r){segtree[node]=num[r];}
int mid=(l+r)/2;
plant(node*2,l,mid);
plant(node*2+1,mid+1,r);
segtree[node]=max(segtree[node*2],segtree[node*2+1]);
}
int query(int node,int st,int end,int l,int r)
{
if(end<r&&st>l)return -1;
if(end>=l&&st<=r)return segtree[node];
int mid=(st+end)/2;
int p=query(node*2,st,mid,l,r);
int q=query(node*2+1,mid+1,end,l,r);
return max(p,q);
}
void update(int node,int st,int end,int ind,int up)
{
if(st==end){segtree[node]=up;return;}
int mid=(st+end)/2;
if(mid>ind)
{
update(node*2+1,mid+1,end,ind,up);
}
else
{
update(node*2,st,mid,ind,up);
}
segtree[node]=max(segtree[node*2],segtree[node*2+1]);
#include <cstring>
#include <cstdio>
#include <cmath>
#include <algorithm>
#define maxn 199999
using namespace std;
int num[maxn];
int segtree[maxn];
void plant(int node ,int l,int r)
{
if(l==r){segtree[node]=num[r];}
int mid=(l+r)/2;
plant(node*2,l,mid);
plant(node*2+1,mid+1,r);
segtree[node]=max(segtree[node*2],segtree[node*2+1]);
}
int query(int node,int st,int end,int l,int r)
{
if(end<r&&st>l)return -1;
if(end>=l&&st<=r)return segtree[node];
int mid=(st+end)/2;
int p=query(node*2,st,mid,l,r);
int q=query(node*2+1,mid+1,end,l,r);
return max(p,q);
}
void update(int node,int st,int end,int ind,int up)
{
if(st==end){segtree[node]=up;return;}
int mid=(st+end)/2;
if(mid>ind)
{
update(node*2+1,mid+1,end,ind,up);
}
else
{
update(node*2,st,mid,ind,up);
}
segtree[node]=max(segtree[node*2],segtree[node*2+1]);
}
int main
{
return 0;
{