萌新求教,全WA样例都不过

P4513 小白逛公园

Twinkle_M @ 2019-07-24 23:51:04

#include <iostream>
#include <cstdio>
#include <cstring>
#include <cmath>
#include <cstdlib>
using namespace std;
struct node{
    int lmax,rmax,sum,dat;
}tree[4000005];
int n;
int a[1000005];
void pushup(int now){
    tree[now].sum=tree[now*2].sum+tree[now*2+1].sum;
    tree[now].lmax=max(tree[now*2].lmax,tree[now*2+1].lmax+tree[now*2].sum);
    tree[now].rmax=max(tree[now*2+1].rmax,tree[now*2+1].sum+tree[now*2].rmax);
    tree[now].dat=max(tree[now*2].dat,tree[now*2+1].dat);
    tree[now].dat=max(tree[now].dat,tree[now*2].rmax+tree[now*2+1].lmax);
}
void build(int now,int l,int r){
    if(l==r){
        tree[now].dat=tree[now].rmax=tree[now].lmax=tree[now].sum=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(now*2,l,mid);
    build(now*2+1,mid+1,r);
    pushup(now); 
}
void change(int now,int l,int r,int x,int v){
    if(l==r&&l==x){
        tree[now].dat=tree[now].rmax=tree[now].lmax=tree[now].sum=v;
        return;
    }
    int mid=(l+r)/2;
    if(x<=mid)
    change(now*2,l,mid,x,v);
    else
    change(now*2+1,mid+1,r,x,v);
    pushup(now);
}
int query(int now,int l,int r,int lt,int lr){
    if(l<=lt&&r>=lr)
    return tree[now].dat;
    int mid=(lt+lr)/2;
    if(r<=mid)
    return query(now << 1,  l, r,lt, mid);
    else if (l > mid) return query(now << 1 | 1,  l, r,mid+1, lr);
    else return query(now << 1, l, mid, lt, mid) + query(now << 1 | 1, mid+1, r,mid+1, lr);
}
int main(){
    int m;
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        scanf("%d",&a[i]);
    }
    build(1, 1, n);
    for (int i = 1; i <= m; ++i){
        int k, x, y; 
        scanf("%d%d%d", &k, &x, &y);
        if (k == 1) {
            if (x > y) swap(x, y);
            printf("%d\n", query(1, x,y, 1, n));
        } else {
            change(1, 1, n, x, y);
        }
    }
    return 0;
} 

|