I Hate ItTime Limit: 9000/3000 MS (Java/Others) Memory Limit: 32768/32768 K (Java/Others)Total Submission(s): 106034 Accepted Submission(s): 39810 Problem Description 很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
Input 本题目包含多组测试,请处理到文件结束。
Output 对于每一次询问操作,在一行里面输出最高成绩。
Sample Input 5 6 1 2 3 4 5 Q 1 5 U 3 6 Q 3 4 Q 4 5 U 2 9 Q 1 5
Sample Output 5 6 5 9 |
这是一道求区间最大值的题,一开始把求最大值写在了updata函数里面,后来发现写在pushup里面就行,我父节点里面放的是最大的值.
# if !0
# include <iostream>
# include <cstring>
# include <string>
# include <cstdio>
using namespace std;
const int maxn = 200005;
int arr[maxn], n, m, sum[maxn << 2];
void Pushup(int rt)
{
sum[rt] = max(sum[rt << 1] , sum[rt << 1 | 1]);
return ;
}
void Build(int l, int r, int rt)
{
if(l == r)
{
sum[rt] = arr[l];
// cout << "rt = " << rt << " " << sum[rt] << endl;
return ;
}
int mid = (l + r) >> 1;
Build(l, mid, rt << 1);
Build(mid + 1, r, rt << 1 | 1);
Pushup(rt);
return ;
}
void Updata(int flag, int add, int l, int r, int rt)
{
if(l == r)
{
sum[rt] = add;
return ;
}
int mid = (l + r) >> 1;
if(flag <= mid)
{
Updata(flag, add, l, mid, rt << 1);
}
else
{
Updata(flag, add, mid + 1, r, rt << 1 | 1);
}
Pushup(rt);
return ;
}
/*
int Query(int L, int R, int l, int r, int rt)
{
if(l >= L && r <= R)
{
return sum[rt];
}
int mid = (l + r) >> 1;
int ans = 0;
if(L <= mid)
{
ans = max(Query(L, R, l, mid, rt << 1), ans);
}
if(R > mid)
{
ans = max(Query(L, R, mid + 1, r, rt << 1 | 1), ans);
}
return ans;
}
*/
//查询线段树
int Query(int L, int R, int l, int r, int rt)//[L,R]表示操作区间,[l,r]表示当前区间,rt:当前节点编号
{
if(l >= L && r <= R)
{
return sum[rt];//在区间内直接返回
}
int mid = (l + r) >> 1;
int ans = 0;
if(L <= mid)
{
ans = max(ans, Query(L, R, l, mid, rt << 1));
}
if(R > mid)
{
ans = max(Query(L, R, mid + 1, r, rt << 1 | 1), ans);
}
return ans;
}
int main(int argc, char *argv[])
{
while(scanf("%d%d", &n, &m) != EOF)
{
memset(sum, false, sizeof(sum));
memset(arr, false, sizeof(arr));
for(int i = 1; i <= n; ++i)
{
scanf("%d",&arr[i]);
}
Build(1, n, 1);
for(int i = 1; i <= m; ++i)
{
char str[10];
scanf("%s", str);
int x, y;
scanf("%d%d",&x, &y);
if(str[0] == 'Q')
{
printf("%d\n", Query(x, y, 1, n, 1));
}
else
{
Updata(x, y, 1, n, 1);
}
}
}
return 0;
}
# endif