这是一道很基本的线段树题目。
#include <iostream>
using namespace std;
struct Node
{
int l,r,mid,max;
}node[600000];
int max(int a,int b)
{
return a>b?a:b;
}
void inint(int a,int b,int n)
{
node[n].l=a;
node[n].max=-1;
node[n].r=b;
node[n].mid=(a+b)/2;
if(a+1==b)
return;
inint(a,(a+b)/2,n*2);
inint((a+b)/2,b,2*n+1);
}
void update(int pos,int value,int n)
{
if(value>node[n].max)
node[n].max=value;
if((node[n].l+1)==node[n].r)
return;
if(pos<node[n].mid)
{
update(pos,value,2*n);
}
if(pos>=node[n].mid)
{
update(pos,value,2*n+1);
}
}
int query(int a,int b,int n)
{
if(node[n].l==a && node[n].r==b)
return node[n].max;
if(a<node[n].mid)
{
if(b<=node[n].mid)
{
return query(a,b,2*n);
}
else
{
return max(query(a,node[n].mid,2*n),query(node[n].mid,b,2*n+1));
}
}
else
{
return query(a,b,2*n+1);
}
}
int main()
{
int n,m,t,a,b,i;
char ch;
while(cin >>n>>m)
{
inint(1,n+1,1);
//cout <<"fdslafj"<<endl;
for(i=1;i<=n;i++)
{
scanf("%d",&t);
update(i,t,1);
//cout <<node[i].max<<endl;
}
for(i=1;i<=m;i++)
{
getchar();
cin >>ch;
cin >>a>>b;
if(ch=='Q')
cout <<query(a,b+1,1)<<endl;//注意是b+1而不是b。因为线段树是一个左开右闭的的区间。
else
update(a,b,1);
}
}
return 0;
}
这是我做的第一道线段树的题目,感觉还不错。继续加油。。。
总结:
1、做主要的就是要构造一棵树,树从上到下编号为1,2,3,4,。。。。2*n+1;
2、写出所要用的函数,如update、inint等函数。
3、最后要找要求输出结果。