题目链接:
http://acm.hdu.edu.cn/showproblem.php?pid=1754
题解:
线段树记录一下最大值搞一搞就好了,注意要用scanf输入,同时数据不止一组。
AC代码:
#include <iostream>
#include <cstdio>
#include <cstring>
#include <algorithm>
#define lc (d<<1)
#define rc (d<<1|1)
#define mid ((l+r)>>1)
using namespace std;
int b[200050];
struct node
{
int mx, l, r;
}tr[800000];
void build(int d, int l, int r)
{
tr[d].l = l, tr[d].r = r;
if(l == r)
{
tr[d].mx = b[l];
return ;
}
build(lc, l, mid);
build(rc, mid+1, r);
tr[d].mx = max(tr[lc].mx, tr[rc].mx);
}
int query(int d, int l, int r, int L, int R)
{
if(tr[d].l == L && tr[d].r == R)
{
return tr[d].mx;
}
if(R <= mid)return query(lc,l,mid,L,R);
else if(L > mid)return query(rc,mid+1,r,L,R);
else
return max(query(lc, l, mid,L,mid), query(rc, mid+1, r,mid+1,R));
}
void update(int d, int pos, int k)
{
if(tr[d].l == pos && tr[d].l == tr[d].r)
{
tr[d].mx = k;
return;
}
int midd = (tr[d].r + tr[d].l)/2;
if(pos <= midd)update(lc,pos,k);
else
update(rc,pos,k);
tr[d].mx = max(tr[lc].mx, tr[rc].mx);
}
int main()
{
int n ,m;
while(~scanf("%d%d", &n, &m))
{
char s[2];
int n1,n2;
for(int i = 1; i <= n; i++)
{
int grade;
scanf("%d",&grade);
b[i] = grade;
}
build(1,1,n);
while(m--)
{
scanf("%s", &s);
scanf("%d%d", &n1, &n2);
if(s[0] == 'Q')
cout << query(1,1,n,n1,n2) <<endl;
else
update(1, n1 ,n2);
}
}
return 0;
}