HDU (线段树 单点更新) I Hate It

和上一道题没什么变化,只不过把单点增减变成了单点替换,把区间求和变成了区间求最大值。

 1 #include <cstdio>

 2 #include <algorithm>

 3 using namespace std;

 4 

 5 const int maxn = (1 << 20);

 6 

 7 int n, m, qL, qR, p, v;

 8 int _max[maxn];

 9 

10 void build(int o, int L, int R)

11 {

12     if(L == R) { scanf("%d", &_max[o]); return; }

13     int M = (L + R) / 2;

14     build(o*2, L, M);

15     build(o*2+1, M+1, R);

16     _max[o] = max(_max[o*2], _max[o*2+1]);

17 }

18 

19 void update(int o, int L, int R)

20 {

21     if(L == R) { _max[o] = v; return; }

22     int M = (L + R) / 2;

23     if(p <= M) update(o*2, L, M);

24     else update(o*2+1, M+1, R);

25     _max[o] = max(_max[o*2], _max[o*2+1]);

26 }

27 

28 int query(int o, int L, int R)

29 {

30     if(qL <= L && qR >= R) return _max[o];

31     int ans = -1;

32     int M = (L + R) / 2;

33     if(qL <= M) ans = max(ans, query(o*2, L, M));

34     if(qR > M) ans = max(ans, query(o*2+1, M+1, R));

35     return ans;

36 }

37 

38 char op[10];

39 

40 int main()

41 {

42     //freopen("in.txt", "r", stdin);

43 

44     while(scanf("%d%d", &n, &m) == 2)

45     {

46         build(1, 1, n);

47 

48         while(m--)

49         {

50             scanf("%s", op);

51             if(op[0] == 'Q')

52             {

53                 scanf("%d%d", &qL, &qR);

54                 printf("%d\n", query(1, 1, n));

55             }

56             else

57             {

58                 scanf("%d%d", &p, &v);

59                 update(1, 1, n);

60             }

61         }

62     }

63 

64     return 0;

65 }
代码君

 

你可能感兴趣的:(HDU)