线段树的基础题,然后这几天其实都在撸线段树的题,但是程序老是有问题……然后最后……我觉得……可能我一开始就错了……于是又回来做这道题……果然!!!几乎调试了我!一天!要哭了好吗……原来加法的优先级还高于位运算是吗……没加个括号整个人都不好了…
言归正传。
题意:先给你n个数的一个序列,之后对这个序列进行两种操作,Q,询问某个区间里的最大的数,U,更新某个数。
小tip:结构体数组可以开到一百万,一定要比n的范围大。注意优先级。
撸完这道题,对于数据结构题的差错略有提高,比如看节点,当前范围,各种输出等。
#include <stdio.h>
#define maxn 1000000
int n,m;
struct node
{
int l,r,max;
}tree[maxn];
int comp(int x,int y)
{
if(x>y) return x;
else return y;
}
void creat(int l,int r,int u)
{
tree[u].l=l;
tree[u].r=r;
if(l==r)
{
scanf("%d",&tree[u].max);
return;
}
int mid=(l+r)/2;
creat(l,mid,u<<1);
creat(mid+1,r,(u<<1)+1);
tree[u].max=comp(tree[u<<1].max,tree[(u<<1)+1].max);
}
int query(int l,int r,int u)
{
int ll=tree[u].l,rr=tree[u].r;
int tem1,tem2;
if(ll==l&&rr==r)
return tree[u].max;
int mid=(ll+rr)/2;
if(l<=mid&&r<=mid)
return query(l,r,u<<1);
else if(l>mid)
return query(l,r,(u<<1)+1);
else
return comp(query(l,mid,u<<1),query(mid+1,r,(u<<1)+1));
}
void update(int loc,int val,int u)
{
int ll=tree[u].l,rr=tree[u].r;
if(ll==loc&&rr==loc)
{
tree[u].max=val;
return;
}
int mid=(ll+rr)/2;
if(loc<=mid) update(loc,val,u<<1);
else update(loc,val,(u<<1)+1);
tree[u].max=comp(tree[u<<1].max,tree[(u<<1)+1].max);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
creat(1,n,1);
int i,j,k;
char s[3],c;
for(i=0;i<m;i++)
{
getchar();
scanf("%c%d%d",&c,&j,&k);
if(c=='Q') printf("%d\n",query(j,k,1));
if(c=='U') update(j,k,1);
}
}
return 0;
}