1.HDU 1754 (点修改)
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const int maxn = 200000 + 5 , inf = 0x3f3f3f3f ;
int sum[maxn*4],A[maxn];
void PushUp(int rt){sum[rt] = max(sum[rt*2],sum[rt*2+1]);}
void Build(int l,int r,int rt){
if(l==r){
sum[rt]=A[l];
return;
}
int m = (l+r)/2;
Build(l,m,rt*2);
Build(m+1,r,rt*2+1);
PushUp(rt);
}
void Updata(int L,int c,int l,int r,int rt){
if(r==l){
sum[rt] = c;
return;
}
int m = (l+r)/2;
if(L<=m) Updata(L,c,l,m,rt*2);
else Updata(L,c,m+1,r,rt*2+1);
PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
int m = (l+r)/2;
int ans = 0;
if(L<=m) ans = max(ans,Query(L,R,l,m,rt*2));
if(R>m ) ans = max(ans,Query(L,R,m+1,r,rt*2+1));
return ans;
}
int main(){
char c;
int n,m,a,b;
while(scanf("%d %d",&n,&m)!=EOF){
mem(sum);mem(A);
for(int i=1;i<=n;i++)scanf("%d",&A[i]);
Build(1,n,1);
while(m--){
scanf(" %c",&c);
if(c=='Q'){
scanf("%d %d",&a,&b);
printf("%d\n",Query(a,b,1,n,1));
}else{
scanf("%d %d",&a,&b);
Updata(a,b,1,n,1);
}
}
}
return 0;
}
2.POJ 3468 (区间修改)
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const int maxn = 100000 + 7 , inf = 0x3f3f3f3f ;
ll sum[maxn<<2],add[maxn<<2];
ll A[maxn];
int n,sum_cmd;
void Pushup(int rt){sum[rt]=sum[rt<<1]+sum[rt<<1|1];}
void Build(int l,int r,int rt){
if(l==r){
sum[rt] = A[l];
return;
}
int m = (l+r)>>1;
Build(l,m,rt<<1);
Build(m+1,r,rt<<1|1);
Pushup(rt);
}
void PushDown(int rt,int ln,int rn){
if(add[rt]){
add[rt<<1]+=add[rt];
add[rt<<1|1]+=add[rt];
sum[rt<<1]+=add[rt]*ln;
sum[rt<<1|1]+=add[rt]*rn;
add[rt] = 0;
}
}
void Updata(int L,int R,int C,int l,int r,int rt){
if(L<=l&&r<=R){
sum[rt]+=C*(r-l+1);
add[rt]+=C;
return;
}
int m = (r+l)>>1;
PushDown(rt,m-l+1,r-m);
if(L<=m) Updata(L,R,C,l,m,rt<<1);
if(R> m) Updata(L,R,C,m+1,r,rt<<1|1);
Pushup(rt);
}
ll Query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
int m = (l+r)>>1;
PushDown(rt,m-l+1,r-m);
ll ans = 0;
if(L<=m) ans+=Query(L,R,l,m,rt<<1);
if(R >m) ans+=Query(L,R,m+1,r,rt<<1|1);
return ans;
}
int main(){
char cmd;
ll a,b,c;
while(~scanf("%d %d",&n,&sum_cmd)){
mem(A);mem(sum);mem(add);
for(int i = 1 ; i <= n ; i ++ )scanf("%lld",&A[i]);
Build(1,n,1);
while(sum_cmd--){
scanf(" %c",&cmd);
if(cmd=='Q'){
scanf("%lld %lld",&a,&b);
printf("%lld\n",Query(a,b,1,n,1));
}else if(cmd=='C'){
scanf("%lld %lld %lld",&a,&b,&c);
Updata(a,b,c,1,n,1);
}
}
}
return 0;
}
3.HDU 1754(区间求最大值)
#include <map>
#include <set>
#include <cmath>
#include <queue>
#include <stack>
#include <cstdio>
#include <vector>
#include <iomanip>
#include <cstdlib>
#include <cstring>
#include <iostream>
#include <algorithm>
#define ll long long
#define mod 1000000007
#define mem(a) memset(a,0,sizeof(a))
using namespace std;
const int maxn = 200000 + 5 , inf = 0x3f3f3f3f ;
int sum[maxn*4],A[maxn];
void PushUp(int rt){sum[rt] = max(sum[rt*2],sum[rt*2+1]);}
void Build(int l,int r,int rt){
if(l==r){
sum[rt]=A[l];
return;
}
int m = (l+r)/2;
Build(l,m,rt*2);
Build(m+1,r,rt*2+1);
PushUp(rt);
}
void Updata(int L,int c,int l,int r,int rt){
if(r==l){
sum[rt] = c;
return;
}
int m = (l+r)/2;
if(L<=m) Updata(L,c,l,m,rt*2);
else Updata(L,c,m+1,r,rt*2+1);
PushUp(rt);
}
int Query(int L,int R,int l,int r,int rt){
if(L<=l&&r<=R){
return sum[rt];
}
int m = (l+r)/2;
int ans = 0;
if(L<=m) ans = max(ans,Query(L,R,l,m,rt*2));
if(R>m ) ans = max(ans,Query(L,R,m+1,r,rt*2+1));
return ans;
}
int main(){
char c;
int n,m,a,b;
while(scanf("%d %d",&n,&m)!=EOF){
mem(sum);mem(A);
for(int i=1;i<=n;i++)scanf("%d",&A[i]);
Build(1,n,1);
while(m--){
scanf(" %c",&c);
if(c=='Q'){
scanf("%d %d",&a,&b);
printf("%d\n",Query(a,b,1,n,1));
}else{
scanf("%d %d",&a,&b);
Updata(a,b,1,n,1);
}
}
}
return 0;
}