线段树求区间最值
来源:互联网 发布:免备案域名 编辑:程序博客网 时间:2024/05/16 07:58
#include<stdio.h>
#include<string.h>
#include<stdlib.h>
const int maxn=200000+10;
struct node{
int s;
int l,r;
};
struct node tree[maxn*10];
int a[maxn];
int max(int x,int y){
return x>y?x:y;
}
int create_tree(int h,int x,int y){
tree[h].l=x;tree[h].r=y;
int mid=(x+y)/2;
if(x==y){
tree[h].s=a[x];
return tree[h].s;
}
int x1=create_tree(h*2,x,mid);
int x2=create_tree(h*2+1,mid+1,y);
tree[h].s=max(x1,x2);
return tree[h].s;
}
int dfs(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 x1=dfs(2*h,x,y);
int x2=dfs(2*h+1,x,y);
return max(x1,x2);
}
int update(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 x1=update(2*h,x);
int x2=update(2*h+1,x);
tree[h].s=max(x1,x2);
return tree[h].s;
}
int main(){
int i,j,k,m,n;
int x,y;
char c;
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++){
getchar();
scanf("%c %d %d",&c,&x,&y);
if(c=='Q'){
printf("%d\n",dfs(1,x,y));
}else{
a[x]=y;
update(1,x);
}
}
}
return 0;
}
#include<string.h>
#include<stdlib.h>
const int maxn=200000+10;
struct node{
int s;
int l,r;
};
struct node tree[maxn*10];
int a[maxn];
int max(int x,int y){
return x>y?x:y;
}
int create_tree(int h,int x,int y){
tree[h].l=x;tree[h].r=y;
int mid=(x+y)/2;
if(x==y){
tree[h].s=a[x];
return tree[h].s;
}
int x1=create_tree(h*2,x,mid);
int x2=create_tree(h*2+1,mid+1,y);
tree[h].s=max(x1,x2);
return tree[h].s;
}
int dfs(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 x1=dfs(2*h,x,y);
int x2=dfs(2*h+1,x,y);
return max(x1,x2);
}
int update(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 x1=update(2*h,x);
int x2=update(2*h+1,x);
tree[h].s=max(x1,x2);
return tree[h].s;
}
int main(){
int i,j,k,m,n;
int x,y;
char c;
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++){
getchar();
scanf("%c %d %d",&c,&x,&y);
if(c=='Q'){
printf("%d\n",dfs(1,x,y));
}else{
a[x]=y;
update(1,x);
}
}
}
return 0;
}
0 0
- 线段树求区间最值
- 线段树求区间最值
- POJ2823(线段树求区间最值)
- POJ2823 - 线段树求区间的最值..
- 线段树三:求任意区间的最值
- hdu1754 求区间最值 线段树 树状数组
- poj 2823 线段树求区间最值
- poj 3875 RMQ或线段树求区间最值
- hdu_1754,线段树单点更新,求区间最值
- hdu1754 I Hate It 线段树求区间最值
- LightOJ Array Queries 1082【线段树求区间最值】
- HDU1754 线段树 + 裸 + 单点更新求区间最值
- 【线段树求区间最值】玲珑oj 1128
- POJ 3264 Balanced Lineup 求线段树区间最值
- 区间最值线段树
- 线段树,区间最值
- POJ 3264 Balanced Lineup 线段树 单点更新 求区间最值
- HDU OJ 1754 I Hate It 【线段树之求区间最值】
- 过滤器Filter
- 矩阵乘法实现
- 1006. Sign In and Sign Out (25)
- [n点无向图个数 分治FFT || 多项式求逆] BZOJ 3456 城市规划
- 修改tomcat启动窗口(startup.bat)的名字
- 线段树求区间最值
- 设计模式之23--解释器模式
- Java并发编程:Callable、Future和FutureTask
- Git Stash用法
- 第三周项目三 求集合并集
- 一次取最新客户评级的sql体验之旅
- 29. Divide Two Integers
- UVA 1194 - Machine Schedule(最大流)
- Xshell无法连接Ubuntu的解决办法