中文题目,题意也给安排的明明白白的。就是一个裸线段树的问题嘛,然后我就开始敲,敲玩跑了样例,没一点毛病,交一发,WA了,一下子给我干懵了,又读了一遍题发现是多组文件输入(吐血),然后把输入放while里,一交就过了。
#include<iostream>
#include<cstdio>
using namespace std;
const int maxn = 2e6+10;
int n,m,a[maxn],tree[maxn*4];
void Build(int p,int l,int r)
{
if(l == r)
{
tree[p] = a[l];
return;
}
int mid = (l + r) / 2;
Build(p * 2,l,mid);
Build(p * 2 + 1,mid + 1,r);
tree[p] = max(tree[p * 2],tree[p * 2 + 1]);
}
void Change(int p,int l,int r,int x,int y)
{
if(l == r)
{
tree[p] = y;
return;
}
int mid = (l + r) / 2;
if(x <= mid)
Change(p * 2,l,mid,x,y);
else
Change(p * 2 + 1,mid + 1,r,x,y);
tree[p] = max(tree[p * 2],tree[p * 2 + 1]);
}
int Query(int p,int l,int r,int L,int R)
{
if(L <= l && R >= r)
return tree[p];
int mid = (l + r) / 2;
if(R <= mid)
return Query(p * 2,l,mid,L,R);
if(L > mid)
return Query(p * 2 + 1,mid + 1,r,L,R);
return max(Query(p * 2,l,mid,L,mid),Query(p * 2 + 1,mid + 1,r,mid + 1,R));
}
int main()
{
while(~scanf("%d %d",&n,&m))
{
for(int i = 1;i <= n; i++)
scanf("%d",&a[i]);
Build(1,1,n);
while(m--)
{
getchar();
char c;
scanf("%c",&c);
if(c == 'Q')
{
int L,R,ans;
scanf("%d %d",&L,&R);
ans = Query(1,1,n,L,R);
printf("%d\n",ans);
}
else if(c == 'U')
{
int x,y;
scanf("%d %d",&x,&y);
Change(1,1,n,x,y);
}
}
}
return 0;
}