kb-07专题线段树-02--单点修改,区间最值
2015-05-30 22:34
162 查看
/* 区间单点该值,区间查询最大值; hdu-1754 */ #include<iostream> #include<cstdio> #include<cstring> using namespace std; typedef struct { int l,r; int value; }V; int n,m,a[200005]={0},MAX=-1; V tr[800005]={0}; void build(int i,int l,int r) { tr[i].l=l; tr[i].r=r; if(l==r) { tr[i].value=a[l]; return ; } int mid=(l+r)/2; build(i<<1,l,mid); build(i<<1|1,mid+1,r); tr[i].value=max(tr[i<<1].value,tr[i<<1|1].value); } void Query(int i,int l,int r) { if(tr[i].l==l&&tr[i].r==r) { MAX=MAX>=tr[i].value?MAX:tr[i].value; return ; } i=i<<1; if(l<=tr[i].r) { if(r<=tr[i].r) Query(i,l,r); else Query(i,l,tr[i].r); } i+=1; if(r>=tr[i].l) { if(l>=tr[i].l) Query(i,l,r); else Query(i,tr[i].l,r); } } void Update(int i,int l,int x) { if(tr[i].l==tr[i].r&&tr[i].l==l) { tr[i].value=x; return ; } int t=i<<1; if(l<=tr[t].r) Update(t,l,x); t+=1; if(l>=tr[t].l) Update(t,l,x); tr[i].value=max(tr[i<<1].value,tr[i<<1|1].value); } int main() { while(scanf("%d%d",&n,&m)!=EOF) { memset(a,0,sizeof(a)); for(int i=1;i<=n;i++) { scanf("%d",&a[i]); } build(1,1,n); /* for(int i=1;i<11;i++) printf("I:%d %d\n",i,tr[i].value); */ char s; int x1,x2; while(m--) { getchar(); scanf("%c%d%d",&s,&x1,&x2); if(s=='Q') { MAX=-1; Query(1,x1,x2); printf("%d\n",MAX); } else { Update(1,x1,x2); } } } return 0; }
相关文章推荐
- ubuntu下c语言hello world
- 关于在linux下用java程序执行linux命令的权限问题
- Solving "Vietnam snake" puzzle with constraint logic programming
- 【十三】队列的链式存储结构
- Fuel 30 分钟快速安装OpenStack(转)
- 2015年百度之星初赛(1) --- C 序列变换
- 使用行为树(Behavior Tree)实现游戏AI
- php页面编码与字符操作
- NoSQL-mongodb-安装
- 计算机经典书籍电子书合集(适合计算机学生学习以及程序员笔试、面试)
- [oVirt MacOS] VMware Fusion 安装oVirt Node 3.5
- CSV文件练手
- 指针常见用法总结
- win32系统 python3.4 安装matplotlib
- kb-07专题--线段树-01-单点修改,区间查和
- CSS盒模型
- TLV格式 及 VARINT数值压缩存储方法
- 快速幂
- Recover Binary Search Tree
- javase 知识1