I Hate It

Time Limit: 9000/3000 MS (Java/Others)    Memory Limit: 32768/32768 K (Java/Others)
Total Submission(s): 106776    Accepted Submission(s): 40096

Problem Description
很多学校流行一种比较的习惯。老师们很喜欢询问,从某某到某某当中,分数最高的是多少。
这让很多学生很反感。

不管你喜不喜欢,现在需要你做的是,就是按照老师的要求,写一个程序,模拟老师的询问。当然,老师有时候需要更新某位同学的成绩。

 
Input
本题目包含多组测试,请处理到文件结束。
在每个测试的第一行,有两个正整数 N 和 M ( 0<N<=200000,0<M<5000 ),分别代表学生的数目和操作的数目。
学生ID编号分别从1编到N。
第二行包含N个整数,代表这N个学生的初始成绩,其中第i个数代表ID为i的学生的成绩。
接下来有M行。每一行有一个字符 C (只取'Q'或'U') ,和两个正整数A,B。
当C为'Q'的时候,表示这是一条询问操作,它询问ID从A到B(包括A,B)的学生当中,成绩最高的是多少。
当C为'U'的时候,表示这是一条更新操作,要求把ID为A的学生的成绩更改为B。
 
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
#include<iostream>
#include<algorithm>
#include<vector>
#include<math.h>
#include<stdio.h>
#include<string.h>
#include<algorithm>
const int n = ;
using namespace std;
int tre[n * ];
void build(int num, int le, int ri)//建立线段树
{
if (le == ri)//如果区间左端点等于区间右端点,则输入区间的每一个元素
{
scanf("%d", &tre[num]);
return;
}
int mid = (le + ri) / ;
build(num * , le, mid);
build(num * + , mid + , ri);
tre[num] = max(tre[num * ], tre[num * + ]);//通过子节点来初始化父亲节点
}
void update(int num, int le, int ri, int x, int y)//单点更新
{
if (le == ri)//找到要更新的x节点所在位置,并对x节点值加y
{
tre[num] = y;
return;
}
int mid = (le + ri) / ;
if (x <= mid)
update(num * , le, mid, x, y);
else
update(num * + , mid + , ri, x, y);
tre[num] = max(tre[num * ], tre[num * + ]);
}
int query(int num, int le, int ri, int x, int y)//区间查询
{
if (x <= le && y >= ri)//如果我们要查询的[x,y]区间比[le,ri]大,那么[le,ri]区间的值就是结果的一部分,直接返回
{
return tre[num];
}
int mid = (le + ri) / ;
int ans = ;//ans是记录查询区间的最大值
if (x <= mid)//查询左子树
ans = max(ans, query(num * , le, mid, x, y));
if (y > mid)//查询右子树
ans = max(ans, query(num * + , mid + , ri, x, y));
return ans;
}
int main()
{
int t, n;
while (cin >> n >> t)
{
build(, , n);
char operate[];
for (int i = ; i < t; i++)
{
cin >> operate;
int x, y;
scanf("%d %d", &x, &y);
if (operate[] == 'U')
{
update(, , n, x, y);
}
if (operate[] == 'Q')
{
cout << query(, , n, x, y) << endl;
}
}
} return ;
}

最新文章

  1. Install Debian note
  2. mybatis 中#{}与${}的区别
  3. 【Spring】利用Spring最简单地使用异步方法
  4. CSS3 旋转代码备忘
  5. 【Bootstrap基础学习】03 Bootstrap插件示例
  6. OracleHelper[.Net 连接Oracle数据库的封装类]
  7. IntelliJ IDEA提示忽略大小写
  8. 学习C++——只声明忘记定义了
  9. Windows:将cmd命令行添加到右键中方法
  10. Eclipse目录实解
  11. C#-委托delegate
  12. 在mac os10.12上安装mysql5.7.18
  13. PHP的ob_flush()与flush()区别
  14. git 彻底删除历史记录中的大文件
  15. 3D打印机如何添加自动调平功能
  16. centos7下安装docker(9.3容器对资源的使用限制-Block IO))
  17. C# 例子1
  18. AngularJS 的异步服务测试与Mocking
  19. javascript区域打印代码
  20. FTP服务器的配置与实现

热门文章

  1. Codeforces 1108E (Array and Segments) 线段树
  2. Python 黑客 004 用Python构建一个SSH僵尸网络 01 简介
  3. HTML和CSS入门教程
  4. Luogu 3233 [HNOI2014]世界树
  5. MySQL中MyISAM引擎与InnoDB引擎性能简单测试
  6. execve(&quot;.. &quot;,[&quot;.. &quot;,&quot;.. &quot;],[/* ..*/])第二个 参数 数组硬传
  7. hadoop streaming 文档
  8. 关于webapi练习过程中遇到的一系列问题记录
  9. Glib学习笔记(一)
  10. 算法训练 数字三角形(DP)