求条
查看原帖
求条
1027663
weistars楼主2025/7/22 10:15

rt,哪里挂了

#include<bits/stdc++.h>
using namespace std;
#define ll long long
const int N = 1e5+5;
int n,m;
ll res;
int st[N];
struct node{
    int l,r,num,tag;
}a[4*N];
int ls(int x){return 2*x;}
int rs(int x){return 2*x+1;}
void push_up(int x){
    a[x].num = a[ls(x)].num+a[rs(x)].num;
}
void push_down(int x){
    if(a[x].tag){
        a[ls(x)].num+=a[x].tag*(a[ls(x)].r-a[ls(x)].l+1);
         a[rs(x)].num+=a[x].tag*(a[rs(x)].r-a[rs(x)].l+1);
        a[ls(x)].tag+=a[x].tag;
        a[rs(x)].tag+=a[x].tag;
        a[x].tag = 0;
    }
}
void update(int x,int l,int r,int k){
    if(l<=a[x].l&&a[x].r<=r){
        a[x].tag+=k;
        a[x].num+=(a[x].r-a[x].l+1)*k;
        return;
    }
    push_down(x);
    int mid = (a[x].l+a[x].r)>>1;
    if(l<=mid)update(ls(x),l,r,k);
    if(r>mid)update(rs(x),l,r,k);
    push_up(x);
}
void build(int x,int l ,int r){
    a[x].l = l,a[x].r = r;
    if(l==r){
        a[x].num = st[l];
        return;
    }
    int mid = (l+r)>>1;
    build(ls(x),l,mid);
    build(rs(x),mid+1,r);
    push_up(x);
}
ll query(int x,int l,int r){
    if(l<=a[x].l&&a[x].r<=r){
        return a[x].num;
    }
    int mid = (l+r)>>1;
    if(l<=mid)res+=query(ls(x),l,r);
    if(mid<r)res+=query(rs(x),l,r);
    return res;
}
void solve(){
    int p,x,y;
    cin>>p>>x>>y;
    if(p==1){
        int k;
        cin>>k;
        update(1,x,y,k);
    }
    if(p==2){
        res = 0;
        cout<<query(1,x,y)<<endl;
    }
}
int main(){
    cin>>n>>m;
    for(int i = 1;i<=n;i++)cin>>st[i];
    build(1,1,n);
    while(m--)solve();
    return 0;
}
2025/7/22 10:15
加载中...