1. 程式人生 > >跟著卿學姐寫線段樹 ----秋實大哥與花

跟著卿學姐寫線段樹 ----秋實大哥與花

秋實大哥是一個儒雅之人,晝聽笙歌夜醉眠,若非月下即花前。

所以秋實大哥精心照料了很多花朵。現在所有的花朵排成了一行,每朵花有一個愉悅值。

秋實大哥每天要對著某一段連續的花朵歌唱,然後這些花朵的愉悅值都會增加一個相同的值vv(vv可能為負)。

同時他想知道每次他唱完歌后這一段連續的花朵的愉悅值總和是多少。

Standard Input

第一行有一個整數nn,表示花朵的總數目。

第二行包含nn個整數a\_ia_i,表示第ii朵花初始的愉悅值。

第三行包含一個整數mm,表示秋實大哥唱了mm天的歌。

接下來mm行,每行包含三個整數ll rr vv,表示秋實大哥對著[l, r][l,r]這個區間內的花朵歌唱,每朵花的愉悅值增加了vv。

1\leq n,m,a\_i,|v|\leq 1000001≤n,m,a_i,∣v∣≤100000,1\leq l\leq r\leq n。1≤l≤r≤n。

Standard Output

輸出共mm行,第ii行表示秋實大哥完成第ii天的歌唱後,那一段花朵的愉悅值總和。

Samples

Input Output
3
0 0 0
3
1 2 1
1 2 -1
1 3 1
2
0
3
Problem ID 1057
Time Limit 1000 ms
Memory Limit 64 MiB
Output Limit 65535 MiB
Source 2015 UESTC Training for Data Structures

 

暈暈乎乎的跟著敲完了

 

#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int maxn = 1e5+7;
int n,q,a[maxn];
struct node{
    int l,r;
    ll sum,lazy;
    void updata(int x){
        sum += 1ll*(r-l+1)*x;
        lazy += x;
    }
}tree[maxn<<2];
void push_up(int x){
    tree[x].sum = tree[x<<1].sum + tree[x<<1|1].sum;
}
void push_down(int x){
    int lazyval = tree[x].lazy;
    if(lazyval){
        tree[x<<1].updata(lazyval);
        tree[x<<1|1].updata(lazyval);
        tree[x].lazy = 0;
    }
}
void build(int x,int l,int r){
    tree[x].l = l,tree[x].r = r;
    tree[x].sum = tree[x].lazy = 0;
    if(l==r){
        tree[x].sum = a[l];
    }else{
        int mid = (l+r)/2;
        build(x<<1,l,mid);
        build(x<<1|1,mid+1,r);
        push_up(x);
    }
}
void updata(int x,int l,int r,ll val){
    int L = tree[x].l ,R = tree[x].r;

    if(l<=L&&R<=r){
        tree[x].updata(val);
    }else{
        push_down(x);
        int mid = (L+R)/2;
        if(mid>=l)updata(x<<1,l,r,val);
        if(r>mid)updata(x<<1|1,l,r,val);
        push_up(x);
    }
}
ll query(int x,int l,int r){
    int L = tree[x].l ,R = tree[x].r;
    if(l<=L&&R<=r){
        return tree[x].sum;
    }else{
        push_down(x);
        ll ans = 0;
        int mid = (L+R)/2;
        if(mid>=l)ans += query(x<<1,l,r);
        if(r>mid)ans += query(x<<1|1,l,r);
        push_up(x);
        return ans;
    }
}
int main(){
    scanf("%d",&n);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    build(1,1,n);
    scanf("%d",&q);
    for(int i=1;i<=q;i++){
        int l,r,val;
        scanf("%d%d%d",&l,&r,&val);
        updata(1,l,r,val);
        printf("%lld\n",query(1,l,r));
    }
    return 0;
}