hdu 1754 线段树之二
2014-08-01 17:17
113 查看
还是挺简单的
#include <iostream> #include <cstring> #include <cstdio> #include <cmath> #include <algorithm> using namespace std; struct p { int l; int r; int max; }tree[888888]; int value[222222]; void construct(int n,int l,int r) { int i,j,k,m; int mid=(l+r)/2; tree[n].l=l; tree[n].r=r; if(l==r) { tree[n].max=value[l]; return; } construct(n*2,l,mid); construct(n*2+1,mid+1,r); tree[n].max=max(tree[n*2].max,tree[n*2+1].max); } void change(int n,int l,int r,int k) { int i,j,m; int mid=(tree[n].l+tree[n].r)/2; if(l==tree[n].l&&r==tree[n].r) { tree[n].max=k; return; } if(r<=mid) { change(n*2,l,r,k); } else { change(n*2+1,l,r,k); } tree[n].max=max(tree[n*2].max,tree[n*2+1[b]].max); } int query(int l,int r,int n) { int i,j,k,m=0; if(tree[n].l==l&&tree[n].r==r) { return (tree[n].max); } int mid=(tree[n].l+tree[n].r)/2; if(r<=mid) { m=max(m,query(l,r,n*2)); } else if(l>mid) { m=max(m,query(l,r,n*2+1)); } else { m=max(m,query(l,mid,n*2)); m=max(m,query(mid+1,r,n*2+1)); } return m; } int main() { int i,j,k,l,m,n,r; char s[11]; while(scanf("%d%d",&n,&m)==2) { for(i=1;i<=n;i++) { scanf("%d",&value[i]); } construct(1,1,n); for(i=0;i<m;i++) { scanf("%s%d%d",s,&l,&r); if(s[0]=='Q') { printf("%d\n",query(l,r,1)); } if(s[0]=='U') { change(1,l,l,r); } } } } |
相关文章推荐
- hdu 1754 I Hate It 线段树单点更新
- HDU1754-I hate it-线段树
- 线段树入门HDU_1754
- hdu1754 I Hate It (线段树 更新点的值)
- HDU---1754 I Hate It【线段树】
- HDU1754线段树解经典的RMQ问题
- HDU 1754-I Hate It(线段树)
- HDU 1754 I Hate It(线段树)
- HDU:1754 I Hate It(线段树)
- hdu 1754 I Hate It (线段树--求区间最大值)(基础)
- hdu 1754 线段树入门 单点更新
- HDU 1754 I Hate It (线段树)
- hdu 1754 I Hate It (线段树)
- hdu 1754 I Hate It 线段树单点更新
- HDU 1754-I Hate It(线段树单节点更新)
- hdu 1754 I Hate It(线段树入门)
- HDU 1754 I Hate It(线段树)
- HDU 1754 I Hate It 线段树RMQ
- HDU - 1754 - I Hate It (线段树 - 区间最值)
- hdu 1754 I Hate It(线段树+单点更新)