I Hate It HDU - 1754 线段树 单点修改+区间最值

时间:2022-10-29 01:21:10
#include<iostream>
#include<cstring>
using namespace std;
const int N=2e5+;
int m,n,p;
struct node{
int l,r;
int v;
}tr[N*];
void pushup(int u)
{
tr[u].v=max(tr[u<<].v,tr[u<<|].v);
}
void build(int u,int l,int r)
{
tr[u]={l,r};
if(l==r)
{
scanf("%d",&tr[u].v);
return ;
}
int mid=l+r>>;
build(u<<,l,mid);
build(u<<|,mid+,r);
pushup(u);
}
int query(int u,int l,int r)
{
if(tr[u].l>=l&&tr[u].r<=r)
return tr[u].v; int mid=tr[u].l+tr[u].r>>;
int v=;
if(l<=mid)
v=max(v,query(u<<,l,r));
if(r>mid)
v=max(v,query(u<<|,l,r));
return v; } void modify(int u,int x,int p)
{
if(tr[u].l==x&&tr[u].r==x)
{
tr[u].v=p;
return;
}
else
{
int mid=tr[u].l+tr[u].r>>;
if(x<=mid)
modify(u<<,x,p);
else
modify(u<<|,x,p);
pushup(u);
}
}
int main()
{ while(scanf("%d%d",&n,&m)!=EOF)
{ int l,r;
int x;
build(,,n); char op[];
while(m--)
{
scanf("%s%d%d",op,&l,&r);
if(op[]=='Q')
printf("%d\n",query(,l,r));
else
modify(,l,r);
}
}
return ;
}