第三篇:范围增加,范围查询最大值
#include<iostream>
using namespace std;
const int maxn=10001;
int arr[maxn];
int big[maxn];
int add[maxn];
void up(int i){
big[i]=max(big[i<<1],big[i<<1|1]);
}
void lazy(int i,int v){
big[i]+=v;
add[i]+=v;
}
void down(int i){
if(add[i]!=0){
lazy(i<<1,add[i]);
lazy(i<<1|1,add[i]);
add[i]=0;
}
}
void build(int l,int r,int i){
if(l==r){
big[i]=arr[l];
}else{
int mid=(l+r)>>1;
build(l,mid,i<<1);
build(mid+1,r,i<<1|1);
up(i);
}
}
void add1(int jobl,int jobr,int jobv,int l,int r,int i){
if(jobl<=l&&jobr>=r){
lazy(i,jobv);
}else{
int mid=(l+r)>>1;
down(i);
if(jobl<=mid){
add1(jobl,jobr,jobv,l,mid,i<<1);
}
if(jobr>=mid+1){
add1(jobl,jobr,jobv,mid+1,r,i<<1|1);
}
up(i);
}
}
int query(int jobl,int jobr,int l,int r,int i){
if(jobl<=l&&jobr>=r){
return big[i];
}
int mid=(l+r)>>1;
down(i);
int ans=0;
if(jobl<=mid){
ans=max(ans,query(jobl,jobr,l,mid,i<<1));
}
if(jobr>=mid+1){
ans=max(ans,query(jobl,jobr,mid+1,r,i<<1|1));
}
return ans;
}
int main()
{
return 0;
}