I Hate It - HDU 1754 线段树
国际惯例中文题目不需要解释题意。
思路:也是个水体,直接裸线段树就可以,没有什么需要注意的地方。写的时候有一个小错误就是刚开始我在本地运行的时候发现Q 1 5一直是零,结果发现是build函数没有写到main里去。
AC代码:
//
// main.cpp
// L
//
// Created by LucienShui on 2017/5/24.
// Copyright © 2017年 LucienShui. All rights reserved.
//
#include <iostream>
#include <algorithm>
#include <set>
#include <string>
#include <vector>
#include <queue>
#include <map>
#include <iomanip>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cctype>
#define memset(a,b) memset(a,b,sizeof(a))
#define il inline
#define ull unsigned long long
using namespace std;
const int MAXN=200005;
int node[MAXN<<2],a[MAXN];
#define ls (u<<1)
#define rs (u<<1|1)
il void build(int u, int left, int right);
il void update(int u, int left, int right, int ai, int num);
il int query(int u, int left, int right, int begin, int end);
il void read(int n);
il void solve(int n, int m);
int main ()
{
#ifndef ONLINE_JUDGE
freopen("in.txt","r",stdin);
#endif // ONLINE_JUDGE
int n,m;
while(~scanf("%d%d",&n,&m)) {
read(n);
build(1,1,n);
solve(n,m);
}
return 0;
}
il void build(int u, int left, int right) {
if(left == right) node[u] = a[left];
else {
int mid = (left + right) >> 1;
build(ls, left, mid);
build(rs, mid+1, right);
node[u] = max(node[ls],node[rs]);
}
}
il void update(int u, int left, int right, int ai, int num) {
if(left == right) {
node[u] = num;
return ;
}
int mid = (left + right) >> 1;
if(ai<=mid) update(ls,left,mid,ai,num);
else update(rs,mid+1,right,ai,num);
node[u] = max(node[ls],node[rs]);
}
il int query(int u, int left, int right, int begin, int end) {
if(begin <= left && right <= end) return node[u];
int mid = (left + right) >> 1;
if(end <= mid) return query(ls, left, mid, begin, end);
else if(begin > mid) return query(rs, mid+1, right, begin, end);
else return max(query(ls, left, mid, begin, end),query(rs, mid+1, right, begin, end));
}
il void read(int n) {
for(int i=1 ; i<=n ; i++) scanf("%d",a+i);
}
il void solve(int n, int m) {
char c;
int a,b;
while(m--) {
scanf(" %c%d%d",&c,&a,&b);
if(c=='Q') printf("%d\n",query(1,1,n,a,b));
else update(1,1,n,a,b);
}
}