锰锌妹子刚学线段树1ns
查看原帖
锰锌妹子刚学线段树1ns
508593
DLDZD楼主2024/10/11 09:51

没过样例

#include<bits/stdc++.h>
#define max(a,b) (a>b? a:b);
using namespace std;
const int N=1e5;
struct tree{
    int l,r,maxn;
    int num;
    int add;
}t[N*4];
int a[N],n,m;
void build(int p,int l,int r){
    t[p].l=l; t[p].r=r;
    if(l==r){
        t[p].num=a[l];
        return ;
    }
    int mid=(l+r)>>1;
    build((p<<1),l,mid);
    build((p<<1)+1,mid+1,r);
    t[p].num=t[(p<<1)].num+t[(p<<1)+1].num;
    return ;
}
void spread(int p){
    t[(p<<1)].num=(t[(p<<1)].r-t[(p<<1)].l+1)*t[p].add;
    t[(p<<1)+1].num=(t[(p<<1)+1].r-t[(p<<1)+1].l+1)*t[p].add;
    t[(p<<1)].add+=t[p].add;
    t[(p<<1)+1].add+=t[p].add;
    t[(p<<1)].add=0;
    return ;
}
void update(int p,int l,int r,int k){
    if(l<=t[p].l&&r>=t[p].r){
        t[p].num+=(t[p].r-t[p].l+1)*k;
        t[p].add+=k;
        return ;
    }
    spread(p);
    int mid=(t[p].l+t[p].r)>>1;
    if(l<=mid) update((p<<1),l,r,k);
    if(mid<r) update((p<<1)+1,l,r,k);
    t[p].num=t[(p<<1)].num+t[(p<<1)+1].num;
    return ;
}
int ask(int p,int l,int r){
    if(l<=t[p].l&&r>=t[p].r){
        return t[p].num;
    }
    spread(p);
    int mid=(t[p].l+t[p].r)>>1;
    int ans=0;
    if(l<=mid) ans+=ask((p<<1),l,r);
    if(mid<r) ans+=ask((p<<1)+1,l,r);
    t[p].num=t[(p<<1)].num+t[(p<<1)+1].num;
    return ans;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++){
        cin>>a[i];
    }
    build(1,1,n);
    for(int i=1;i<=m;i++){
        int opt,x,y,k;
        cin>>opt>>x>>y;
        if(opt==1){
            cin>>k;
            update(1,x,y,k);
        }
        else{
            cout<<ask(1,x,y)<<"\n";
        }
    }
    return 0;
}

2024/10/11 09:51
加载中...