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

Hint

Huge input,the C function scanf() will work better than cin 
 

#include<iostream>
#include<cstdio>
#include<cstring>
using namespace std;
#define maxn 200005
#define inf 0x3f3f3f3f
int sum[maxn<<2],ll[maxn<<2],rr[maxn<<2];
int a[maxn];
inline void pushup(int i){
sum[i]=max(sum[i<<1],sum[(i<<1)|1]);
}
void build(int l,int r,int i){
ll[i]=l;
rr[i]=r;
if(l==r){
sum[i]=a[l];
return;
}
int m=(ll[i]+rr[i])>>1,ls=i<<1,rs=ls|1;
build(l,m,ls);
build(m+1,r,rs);
pushup(i);
}
void update(int k,int v,int i){
if(ll[i]==rr[i]){
sum[i]=v;
return ;
}
int m=(ll[i]+rr[i])>>1,ls=i<<1,rs=ls|1;
if(k<=m)update(k,v,ls);
else update(k,v,rs);
pushup(i);
}
int query(int l,int r,int i){
if(l<=ll[i]&&rr[i]<=r){
return sum[i];
}
int m=(ll[i]+rr[i])>>1,ls=i<<1,rs=ls|1;
int ans=0;
if(l<=m)ans=max(query(l,r,ls),ans);
if(m<r)ans=max(query(l,r,rs),ans);
return ans;
}
int main()
{
int n,m;
int u,v;
//freopen("in.txt","r",stdin);
while(~scanf("%d%d",&n,&m)){
for(int i=1;i<=n;i++){
scanf("%d",&a[i]);
}
build(1,n,1);
char q[2];
while(m--){
scanf("%s %d %d",q,&u,&v); //用c会出问题
if(q[0]=='Q'){
printf("%d\n",query(u,v,1));
}
else {
update(u,v,1);
}
}
}
}

I hate it (线段树)的更多相关文章

  1. bzoj3932--可持久化线段树

    题目大意: 最近实验室正在为其管理的超级计算机编制一套任务管理系统,而你被安排完成其中的查询部分.超级计算机中的 任务用三元组(Si,Ei,Pi)描述,(Si,Ei,Pi)表示任务从第Si秒开始,在第 ...

  2. codevs 1082 线段树练习 3(区间维护)

    codevs 1082 线段树练习 3  时间限制: 3 s  空间限制: 128000 KB  题目等级 : 大师 Master 题目描述 Description 给你N个数,有两种操作: 1:给区 ...

  3. codevs 1576 最长上升子序列的线段树优化

    题目:codevs 1576 最长严格上升子序列 链接:http://codevs.cn/problem/1576/ 优化的地方是 1到i-1 中最大的 f[j]值,并且A[j]<A[i] .根 ...

  4. codevs 1080 线段树点修改

    先来介绍一下线段树. 线段树是一个把线段,或者说一个区间储存在二叉树中.如图所示的就是一棵线段树,它维护一个区间的和. 蓝色数字的是线段树的节点在数组中的位置,它表示的区间已经在图上标出,它的值就是这 ...

  5. codevs 1082 线段树区间求和

    codevs 1082 线段树练习3 链接:http://codevs.cn/problem/1082/ sumv是维护求和的线段树,addv是标记这歌节点所在区间还需要加上的值. 我的线段树写法在运 ...

  6. PYOJ 44. 【HNSDFZ2016 #6】可持久化线段树

    #44. [HNSDFZ2016 #6]可持久化线段树 统计 描述 提交 自定义测试 题目描述 现有一序列 AA.您需要写一棵可持久化线段树,以实现如下操作: A v p x:对于版本v的序列,给 A ...

  7. CF719E(线段树+矩阵快速幂)

    题意:给你一个数列a,a[i]表示斐波那契数列的下标为a[i],求区间对应斐波那契数列数字的和,还要求能够维护对区间内所有下标加d的操作 分析:线段树 线段树的每个节点表示(f[i],f[i-1])这 ...

  8. 【BZOJ-3779】重组病毒 LinkCutTree + 线段树 + DFS序

    3779: 重组病毒 Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 224  Solved: 95[Submit][Status][Discuss] ...

  9. 【BZOJ-3673&3674】可持久化并查集 可持久化线段树 + 并查集

    3673: 可持久化并查集 by zky Time Limit: 5 Sec  Memory Limit: 128 MBSubmit: 1878  Solved: 846[Submit][Status ...

  10. 【BZOJ-2653】middle 可持久化线段树 + 二分

    2653: middle Time Limit: 20 Sec  Memory Limit: 512 MBSubmit: 1298  Solved: 734[Submit][Status][Discu ...

随机推荐

  1. 《SAS编程与数据挖掘商业案例》学习笔记之十五

    继续<SAS编程与数据挖掘商业案例>读书笔记,本次重点:输出控制 主要内容包含:log窗体输出控制.output窗体输出控制.ods输出控制 1.log窗体输出控制 将日志输出到外部文件 ...

  2. Android中的WiFi P2P

    Android中的WiFi P2P可以同意一定范围内的设备通过Wifi直接互连而不必通过热点或互联网. 使用WiFi P2P须要Android API Level >= 14才干够,并且不要忘记 ...

  3. poj 1182 食物链 &amp;&amp; nyoj 207(种类并查集)

    食物链 Time Limit: 1000MS   Memory Limit: 10000K Total Submissions: 52414   Accepted: 15346 Description ...

  4. USACO 2.1 Hamming Codes

    Hamming CodesRob Kolstad Given N, B, and D: Find a set of N codewords (1 <= N <= 64), each of ...

  5. web前端简单布局

    jquery实现的计算器

  6. Core篇——初探Core配置管理

    文章目录 1.命令行配置 2.Json文件配置 3.配置文件文本至C#对象实例的映射 4.配置文件热更新 5.总结 命令行的配置 我们首先来创建一个.net core 的控制台项目,然后引入.net ...

  7. Python 接口类或抽象类 反射

    # 抽象类或者接口类,制定规范,统一方法名 # # 抽象类或者接口类,制定规范,统一方法名 from abc import ABCMeta,abstractmethod class Payrole(m ...

  8. xbox 相关

    https://live.xbox.com/zh-CN/avatareditor xboxgames://

  9. sql:String格式转换为时间进行比较

    字符串的格式为 yyyy-MM-dd HH:mm:ss str_to_date(a.time, '%Y-%m-%d %k:%i') < str_to_date(b.time, '%Y-%m-%d ...

  10. 路飞学城Python-Day38(第四模块思维导图)