http://acm.hdu.edu.cn/showproblem.php?pid=1754
线段树入门题:求区间段的最大值
#include "iostream"
#include "stdio.h"
using namespace std;
const int MAX = 200001;
int big;
struct node
{
int r, l, max;
}tree[MAX * 3];
void Create(int t, int left, int right) //建树
{
tree[t].l = left;
tree[t].r = right;
tree[t].max = 0;
if(left == right)
return;
int mid = (left + right) >> 1;
Create(t * 2, left, mid);
Create(t * 2 + 1, mid + 1, right);
}
void Updata(int t, int x, int val)
{
if(tree[t].l == x && tree[t].r == x)
tree[t].max = val;
else
{
int mid = (tree[t].l + tree[t].r) >> 1;
if(x <= mid)
Updata(t * 2, x, val);
else
Updata(t * 2 + 1, x, val);
}
if(tree[t].max < val)
tree[t].max = val;
}
void FindMax(int t, int left, int right)
{
if(tree[t].l == left && tree[t].r == right)
{
if(tree[t].max > big)
big = tree[t].max;
return;
}
int mid = (tree[t].l + tree[t].r) >> 1;
if(left > mid)
{
FindMax(t * 2 + 1, left, right);
}
else if(right <= mid)
{
FindMax(t * 2, left, right);
}
else
{
FindMax(t * 2, left, mid);
FindMax(t * 2 + 1, mid + 1, right);
}
}
int main()
{
int n, m, i, a, b;
char ch;
while(scanf("%d%d", &n, &m) != EOF)
{
Create(1, 1, n);
for(i = 1; i <= n; i++)
{
cin >> a;
Updata(1, i, a);
}
while(m--)
{
cin >> ch >> a >> b;
if(ch == 'U')
Updata(1, a, b);
else
{
big = 0;
FindMax(1, a, b);
cout << big << endl;
}
}
}
return 0;
}