hdu1754就是一个线段树模板题,不同的是每次的value不是加上去,而是替换,这就要求替换过程就需要更新父节点最大值和sum
#include <iostream>
using namespace std;
const int MAX_N = 200005;
typedef long long ll;
int a[MAX_N];
struct Node
{
int l, r;
ll Max, sum;
}tr[MAX_N*4];
void push_up(int id)
{
tr[id].sum = tr[id<<1].sum + tr[id<<1|1].sum;
tr[id].Max = max(tr[id<<1].Max, tr[id<<1|1].Max);
}
void build(int id, int l, int r)
{
tr[id].l = l, tr[id].r = r;
tr[id].Max = tr[id].sum = 0;
if (l == r)
{
tr[id].sum = a[l];
tr[id].Max = a[l];
return;
}
int mid = (l+r)>>1;
build(id<<1, l, mid);
build(id<<1|1, mid+1, r);
push_up(id);
}
void update(int id, int l, int r, int val)
{
if (tr[id].l == l && tr[id].r == r)
{
tr[id].sum = val;
tr[id].Max = val;
while (id/=2)
{
push_up(id);
}
return;
}
int mid = (tr[id].l + tr[id].r) >> 1;
if (r<=mid)
{
update(id<<1, l, r, val);
}
else if (l>mid)
{
update(id<<1|1, l, r, val);
}
else
{
update(id<<1, l, mid, val);
update(id<<1|1, mid+1, r, val);
}
}
ll query(int id, int l, int r)
{
if (tr[id].l == l && tr[id].r == r)
{
return tr[id].Max;
}
int mid = (tr[id].l + tr[id].r)>>1;
if (r<=mid)
{
return query(id<<1, l, r);
}
else if (l>mid)
{
return query(id<<1|1, l, r);
}
else
{
return max(query(id<<1, l, mid), query(id<<1|1, mid+1, r));
}
}
int main()
{
int n, m;
while (scanf("%d %d", &n, &m) != EOF)
{
for (int i=1; i<=n; i++)
{
scanf("%d", &a[i]);
}
build(1,1, n);
while (m--)
{
char c;
int l, r;
getchar();
scanf("%c %d %d", &c, &l, &r);
if (c == 'Q')
{
printf("%lld\n", query(1, l, r));
}
else
{
update(1, l, l, r);
}
}
}
return 0;
}