点修改区间查询 HDU1754
2015-07-31 10:06
330 查看
#include <iostream> #include <cstdio> using namespace std; int an[200010]; struct Node { int l; int r; int ma; }bn[800010]; void build(int k,int l,int r) { bn[k].l=l; bn[k].r=r; if(l==r) { bn[k].ma=an[l]; return ; } int lk=k*2; int rk=lk+1; int mid=(l+r)/2; build(lk,l,mid); build(rk,mid+1,r); bn[k].ma=max(bn[lk].ma,bn[rk].ma); } void change(int k,int i,int a) { if(bn[k].l==i&&bn[k].r==i) { bn[k].ma=a; return ; } int lk=k*2; int rk=lk+1; if(bn[lk].r>=i) change(lk,i,a); else if(bn[rk].l<=i) change(rk,i,a); bn[k].ma=max(bn[lk].ma,bn[rk].ma); } int search(int k,int l,int r) { if(bn[k].l==l&&bn[k].r==r) { return bn[k].ma; } int lk=k*2; int rk=lk+1; if(bn[lk].r>=r) return search(lk,l,r); else if(bn[rk].l<=l) return search(rk,l,r); else return max(search(lk,l,bn[lk].r),search(rk,bn[rk].l,r)); } int main() { int n,m; while(scanf("%d%d",&n,&m)!=EOF) { for(int i=1;i<=n;i++) scanf("%d",&an[i]); build(1,1,n); for(int i=0;i<m;i++) { char ca; int a,b; scanf(" %c ",&ca); scanf("%d%d",&a,&b); if(ca=='Q') printf("%d\n",search(1,a,b)); else if(ca=='U') change(1,a,b); } } return 0; }
View Code
相关文章推荐
- PAT (Advanced Level) 1091. Acute Stroke (30) 3维DFS(10M数据时栈溢出)、3维BFS(AC)
- 字符串反转之——手摇算法
- hdu5328
- 【暑期基础】M HDU 2012 素数判定
- Let the Balloon Rise
- Wi-Fi 定位的原理
- Android ContentObserver 监听图库变化
- 读SAFEARRAY,内容是BSTR一维数组
- 暑假训练-个人赛第五场
- Trapping Rain Water
- 02_js中接口的定义和使用
- HDU 1829 A Bug's Life
- Spring_配置文件格式介绍--真的蛮详细
- HDU 5326 Work(求每个人的下属,直接和间接)
- Git使用总结(win7)
- 面向对象设计原则详解:单一职责原则
- tomcat
- 【暑期基础】L HDU 2011 多项式求和
- 【暑期基础】K HDU 2010 水仙花数
- 使用Qt显示openCV矩阵图片