HDU1754线段树
2016-01-31 15:04
239 查看
#include<iostream> #include<cstdio> using namespace std; struct node{ int s; int l,r; }; struct node tree[2000100]; int a[200010]; int create_tree(int h,int x,int y){//建树 int mid=(x+y)/2;//中间 tree[h].l=x;tree[h].r=y; if(x==y){//如果左右范围相等 tree[h].s=a[x]; return tree[h].s; } int a=create_tree(2*h,x,mid);//向两边分开递归 int b=create_tree(2*h+1,mid+1,y); tree[h].s=a>b?a:b; return tree[h].s; } int Q(int h,int x,int y){//询问 if(y<tree[h].l || x>tree[h].r)//如果需要查询的范围不在原来的范围内 return 0; if(x<=tree[h].l && y>=tree[h].r)//如果需要查询的范围刚好匹配 return tree[h].s; int a=Q(2*h,x,y);//向两侧分别递归 int b=Q(2*h+1,x,y); return a>b?a:b;; } int U(int h,int x){//更新 if(x<tree[h].l || x>tree[h].r) return tree[h].s; if(tree[h].l==tree[h].r){ tree[h].s=a[tree[h].l]; return tree[h].s; } int a=U(2*h,x); int b=U(2*h+1,x); tree[h].s=a>b?a:b; return tree[h].s; } int main(){ int i,j,k,m,n,x,y; while(scanf("%d%d",&n,&m)!=EOF){ for(i=1;i<=n;i++)scanf("%d",&a[i]); create_tree(1,1,n); for(i=1;i<=m;i++){ char c; getchar(); scanf("%c%d%d",&c,&x,&y); if(c=='Q'){ cout<<Q(1,x,y)<<endl; }else{ a[x]=y; U(1,x); } } } return 0; }
相关文章推荐
- Python注释
- ajax与Jquery中的Ajax
- Java读取properties文件中文乱码问题解决
- C语言小结之链表
- 9. Swift 中的函数
- OpenWRT开发之——研究包的Makefile
- android-Implementing Descendant Navigation,Notifying the User
- linux内核输入子系统分析
- 一组常用的弹出窗口用法
- 从头到尾彻底理解KMP
- ajax SpringMVC如何返回json
- HDU1495 非常可乐
- WEB SQL Database 随机读取函数
- fedora 21 + win8 开机启动项的顺序设为默认启动win8
- 【校内互测】回文词
- C++的map与hash_map
- startActivity()和onActivityResult() 返回上一个Activity并传值
- 一行代码突破百度网盘限制下载大文件
- hadoop(六) - ZooKeeper安装与配置
- Java 基于TCP/IP 实现简单的 socket 通信