题目链接:[kuangbin带你飞]专题七 线段树 B - I Hate It
Time Limit:3000MS Memory Limit:32768KB 64bit IO Format:%I64d & %I64u
题意
Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0
Output
对于每一次询问操作,在一行里面输出最高成绩。
思路
裸的模版题,线段树求解区间最值。
代码
#include <iostream>
#include <algorithm>
#include <cstring>
#include <cstdio>
#include <cstdlib>
#include <vector>
using namespace std;
const int N = 200009;
const int MAX = N*3;
int Sum[MAX];
void build(int l, int r, int k)
{
if(l == r)
{
scanf("%d", &Sum[k]);
return;
}
int mid = (l+r)>>1;
build(l, mid, k<<1);
build(mid+1, r, k<<1 | 1);
Sum[k] = max(Sum[k<<1], Sum[k<<1 | 1]);
}
void update(int l, int r, int pos, int d, int k)
{
if(l == r)
{
Sum[k] = d;
return;
}
int mid = (l+r)>>1;
if(pos<=mid)
update(l, mid, pos, d, k<<1);
else
update(mid+1, r, pos, d, k<<1 | 1);
Sum[k] = max(Sum[k<<1], Sum[k<<1 | 1]);
}
int find(int l, int r, int tol, int tor, int k)
{
if(tol <= l && tor >= r)
return Sum[k];
int mid = (l+r)>>1;
int ans = 0;
if(tol <= mid)
ans = max(ans, find(l, mid, tol, tor, k<<1));
if(tor > mid)
ans = max(ans, find(mid+1, r, tol, tor, k<<1 | 1));
return ans;
}
int main()
{
ios_base::sync_with_stdio(false);
int n, m;
while(~scanf("%d%d", &n, &m))
{
build(1, n, 1);
char str[10];
int i, j;
while(m--)
{
scanf("%s%d%d", str, &i, &j);
if(str[0] == 'U')
update(1, n, i, j, 1);
else
printf("%d\n" ,find(1, n, i, j, 1));
}
}
return 0;
}