hdu 1754
#include<bits/stdc++.h>
using namespace std;
const int N = 200001 * 4;
const int M = 5001;
int n,m;
struct node{
int l, r, val;
};
node stu[N];
int a[N];
void pushup(int i){
stu[i].val = max(stu[i << 1].val, stu[(i << 1) | 1].val);
}
void build(int i, int l, int r){
stu[i].l = l; stu[i].r = r;
if(l == r){
stu[i].val = a[l];
return ;
}
int mid = (l+r)/2;
build(i<<1, l, mid);
build((i<<1)|1, mid+1, r);
pushup(i);
}
int maxv(int i,int l, int r){
if(stu[i].l==l && stu[i].r==r)
return stu[i].val;
int mid = (stu[i].l + stu[i].r)/2;
if(r<=mid) return maxv(i<<1, l, r);
else if(l>mid) return maxv((i<<1)|1, l, r);
else return max(maxv(i<<1, l, mid), maxv((i<<1)|1, mid+1, r));
}
void change(int i, int k, int num){
if(stu[i].l==k && stu[i].r==k){
stu[i].val = num;
return ;
}
int mid = (stu[i].l + stu[i].r)/2;
if(k<=mid) change(i<<1, k, num);
else change((i<<1)|1, k, num);
pushup(i);
}
int main(){
while(~scanf("%d %d",&n, &m)){
for(int i=1; i<=n; i++)
scanf("%d",a+i);
build(1, 1, n);
for(int i=1; i<=m; i++){
getchar();
char ch;
int a, b;
scanf("%c %d %d",&ch, &a, &b);
if(ch=='Q')
printf("%d\n",maxv(1, a, b));
else
change(1, a, b);
}
}
}
hdu 1166
这是水题没错,但我万万没想到让我WA掉的是因为一个long long。
#include<iostream>
#include<algorithm>
using namespace std;
const int N = 50005;
int t, n;
int a[N];
struct node{
int l, r;
int sum;//因为long long WA掉了
int mid() { return (l + r) >> 1;}
} tree[N << 2];
void pushup(int rt){
tree[rt].sum = tree[rt << 1].sum + tree[rt << 1 | 1].sum;
}
void build(int l, int r, int rt){
tree[rt].l = l;
tree[rt].r = r;
if(l==r){tree[rt].sum = a[l];return;}
int mid = tree[rt].mid();
build(l, mid, rt << 1);
build(mid + 1, r, rt << 1 | 1);
pushup(rt);
}
void add(int c, int l, int rt){
if(tree[rt].l==l && tree[rt].r==l){
tree[rt].sum += c;
return;
}
int mid = tree[rt].mid();
if(l<=mid) add(c, l, rt << 1);
else add(c, l, rt << 1 | 1);
pushup(rt);
}
void sub(int c, int l, int rt){
if(tree[rt].l==l && tree[rt].r==l){
tree[rt].sum -= c;
return;
}
int mid = tree[rt].mid();
if(l<=mid) sub(c, l, rt << 1);
else sub(c, l, rt << 1 | 1);
pushup(rt);
}
int query(int l, int r, int rt){
if (tree[rt].l == l && tree[rt].r==r)
return tree[rt].sum;
int mid = tree[rt].mid();
int ans = 0;
if(r<=mid) ans += query(l, r, rt << 1);
else if(l>mid) ans += query(l, r, rt << 1 | 1);
else{
ans += query(l, mid, rt << 1);
ans += query(mid + 1, r, rt << 1 | 1);
}
return ans;
}
int main(){
scanf("%d", &t);
for(int cnt=1; cnt<=t; cnt++){
scanf("%d", &n);
for (int i = 1; i <= n; i++)
scanf("%d", a + i);
build(1, n, 1);
char str[6];
int a, b;
printf("Case %d:\n", cnt);
while(~scanf("%s", str)){
if(str[0]=='E') break;
scanf("%d%d", &a, &b);
if(str[0]=='Q')
printf("%d\n", query(a, b, 1));
else if(str[0]=='A')
add(b, a, 1);
else
sub(b, a, 1);
}
}
return 0;
}