http://acm.hdu.edu.cn/showproblem.php?pid=1754

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

Hint

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

Memory Limit Exceeded了好久,就因为输入字符时,电脑比人工多录入一个空字符。
#include<iostream>
#include<algorithm>
#include<string>
#include<cstdio>
#include<cstring>
#include<cmath>
using namespace std;
int node[];
int max(int a,int b)
{
return a>b?a:b;
}
void PushUp(int t)
{
node[t]=max(node[t<<],node[(t<<)+]);
}
void build(int l,int r,int t)
{
int mid;
mid=(l+r)>>;
if(l==r)
{
scanf("%d",&node[t]);
return ;
}
build(l,mid,t<<);
build(mid+,r,(t<<)+);
PushUp(t);
}
void update(int p,int add,int l,int r,int t)
{
int mid;
mid=(l+r)>>;
if(l==r)
{
node[t]=add;
return ;
}
if(p<=mid)update(p,add,l,mid,t<<);
else update(p,add,mid+,r,(t<<)+);
PushUp(t);
}
int query(int ll,int rr,int l,int r,int t)
{
int k=;
int mid=(l+r)>>;
if(ll<=l && rr>=r) return node[t];
if(ll<=mid) k=max(k,query(ll,rr,l,mid,t<<));
if(rr>mid) k=max(k,query(ll,rr,mid+,r,(t<<)+));
return k;
}
int main()
{
int l,x,n,i,T;
char s;//s[5];
while(scanf("%d %d",&n,&T)!=EOF)
{
build(,n,);
for(i=;i<T;i++)
{
scanf("%*c%c%d%d",&s,&l,&x);
//scanf("%s%d%d",s,&l,&x);
if(s=='U')//if(s[0]=='U')
{
update(l,x,,n,);
}
else
{
printf("%d\n",query(l,x,,n,));
}
}
}
return ;
}

非递归写法

#include <bits/stdc++.h>
using namespace std;
const int maxn=;
int sum[maxn<<];
int n,m,N,x,y;
char ch[];
int query(int L,int R)
{
int ans=-;
for(int i=N+L-,j=N+R+;i^j^;i>>=,j>>=)
{
if(~i&) ans=max(ans,sum[i^]);
if(j&) ans=max(ans,sum[j^]);
}
return ans;
}
void updata(int L,int val)
{
sum[N+L]=val;
for(int i=N+L>>;i;i>>=)
sum[i]=max(sum[i<<],sum[i<<|]);
}
int main()
{
while(scanf("%d%d",&n,&m)!=EOF)
{
memset(sum,,sizeof(sum));
N=;while(N<n+) N<<=;
for(int i=;i<=n;i++)
scanf("%d",&sum[N+i]);
for(int i=N-;i;i--)
sum[i]=max(sum[i<<],sum[i<<|]);
for(int i=;i<m;i++)
{
scanf("%s",&ch);
scanf("%d%d",&x,&y);
if(ch[]=='Q') printf("%d\n",query(x,y));
else updata(x,y);
}
}
return ;
}

最新文章

  1. 在ASP.NET中基于Owin OAuth使用Client Credentials Grant授权发放Token
  2. Codeforces713C Sonya and Problem Wihtout a Legend(DP)
  3. 01.线性表 ArrayList
  4. WPF国际化(多语言)
  5. ASP.NET几种清除页面缓存的方法
  6. Facebook和Google如何激发工程师的创造力
  7. ideal中如何添加几个不同的项目在同一个idea页面显示(同一个窗口显示多个工程)
  8. 最棒的 JavaScript 学习指南(2018版)
  9. 简单探讨spring整合mybatis时sqlSession不需要释放关闭的问题
  10. [SoapUI] 检查测试步骤的类型或者或者某种特定类型的步骤列表
  11. 字符界面的贪吃蛇--链表--C++
  12. SQLAlchemy 与 fask-SQLAlchemy 中的多表查询例子
  13. Jquery-plugins-toastr-消息提示
  14. 你应该抓紧学习Python,它是开发Web应用最强大的语言
  15. 使用create-react-app模板模仿12306app
  16. CodeForces 459D Pashmak and Parmida&#39;s problem
  17. FlatBuffer入门笔记
  18. 525. Contiguous Array两位求和为1的对数
  19. Qt 之模型/视图(自定义按钮)
  20. Python3.6写socket程序

热门文章

  1. L2CAP数据发送和接收
  2. 英语影视台词---七、THE GREAT GATSBY QUOTES
  3. zzuoj--1001--汽水瓶(简单数学)
  4. 16.boost图深度优先遍历DFS
  5. Linux安装软件的几种方式
  6. hdu 1257/1800 - 贪心,dp
  7. gcd的queue与group
  8. java中的json
  9. matplotlib bar函数重新封装
  10. word中输入公式方案