题意:
给出n个学生的分数,每次可以选择两个操作,1是选择将区间某个点学生的分数更新,2是询问区间学生的最大值。
题解:
入门题,直接搞。
#include<iostream> #include<math.h> #include<stdio.h> #include<algorithm> #include<string.h> #include<vector> #include<queue> #include<map> #include<set> #define B(x) (1<<(x)) using namespace std; typedef long long ll; typedef unsigned long long ull; void cmax(int& a, int b){ if (b>a)a = b; } void cmin(int& a, int b){ if (b<a)a = b; } void cmax(ll& a, ll b){ if (b>a)a = b; } void cmin(ll& a, ll b){ if (b<a)a = b; } void add(int& a, int b, int mod){ a = (a + b) % mod; } void add(ll& a, ll b, ll mod){ a = (a + b) % mod; } #define lson rt<<1 #define rson rt<<1|1 const int oo = 0x3f3f3f3f; const ll OO = 0x3f3f3f3f3f3f3f3f; const ll MOD = 1000000007; const double eps = 1e-9; const int maxn = 2000005; struct SegTree{ int l, r, max; int mid(){ return (l + r) >> 1; } }tree[maxn << 1]; void push_up(int rt){ tree[rt].max = max(tree[lson].max, tree[rson].max); } void build(int l, int r, int rt){ tree[rt].l = l; tree[rt].r = r; if (l == r){ scanf("%d", &tree[rt].max); return; } int mid = (l + r) >> 1; build(l, mid, lson); build(mid + 1, r, rson); push_up(rt); } void update(int value, int pos, int rt){ if (tree[rt].l == tree[rt].r && tree[rt].l == pos){ tree[rt].max = value; return; } int mid = tree[rt].mid(); if (pos <= mid) update(value, pos, lson); else update(value, pos, rson); push_up(rt); } int query(int l, int r, int rt){ if (l <= tree[rt].l && tree[rt].r <= r) return tree[rt].max; int mid = tree[rt].mid(); int res = 0; if (l <= mid) cmax(res, query(l, r, lson)); if (mid + 1 <= r) cmax(res, query(l, r, rson)); return res; } int main(){ int n, q, a, b; char op; while (scanf("%d %d", &n, &q) != EOF){ build(1, n, 1); while (q--){ getchar(); scanf("%c%d%d", &op, &a, &b); if (op == 'Q') printf("%d\n", query(a, b, 1)); else update(b, a, 1); } } return 0; }