线段树之单点修改,区间查询
用线段树维护区间最值
注意:
数据范围较大,不要使用cin/cout
不要使用库中的max,也不要宏定义max.
会超时!!!
#include<cstdio>
#define Mx 500020
#define inf 0x3f3f3f3f
struct node
{
int l,r,key;
}q[Mx*2];
int a[Mx],root,ql,qr,tot,ans;
int max(int a,int b)
{
return a>b?a:b;
}
void update(int x)
{
q[x].key=max(q[q[x].l].key,q[q[x].r].key);
}
int build(int s,int t)
{
int now,mid;
tot++;
now=tot;
if (s==t)
{
q[now].key=a[s];
return now;
}
mid=(s+t)/2;
q[now].l=build(s,mid);
q[now].r=build(mid+1,t);
update(now);
return now;
}
void query(int x,int s,int t)
{
if ((ql<=s)&&(qr>=t))
{
ans=max(ans,q[x].key);
return;
}
int mid=(s+t)/2;
if (ql<=mid) query(q[x].l,s,mid);
if (qr>mid) query(q[x].r,mid+1,t);
}
void revise(int x,int s,int t)
{
if ((ql==s)&&(s==t))
{
q[x].key=qr;
return;
}
int mid=(s+t)/2;
if (ql<=mid) revise(q[x].l,s,mid);
else revise(q[x].r,mid+1,t);
update(x);
}
int main()
{
int n,m;
while (scanf("%d%d",&n,&m)!=EOF)
{
for (int i=1;i<=n;i++) scanf("%d",&a[i]);
char ch;
tot=0;
root=build(1,n);
while (m--)
{
getchar();
scanf("%c %d %d",&ch,&ql,&qr);
if (ch=='Q')
{
ans=-inf;
query(root,1,n);
printf("%d\n",ans);
}else revise(root,1,n);
}
}
return 0;
}