求解不知为何错

P3372 【模板】线段树 1

zhutongxuan @ 2024-12-18 17:33:05

#include<bits/stdc++.h>
#define int long long
#define double long double
#define INF 1e18
using namespace std;
struct node{
    int l,r,sum;
}tree[400001];
int n,m,a[100001],opt,x,y,z,lazy[400001];
void build(int k,int l,int r){
    tree[k].l=l,tree[k].r=r;
    if(l==r){
        tree[k].sum=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(2*k,l,mid);
    build(2*k+1,mid+1,r);
    tree[k].sum=tree[2*k].sum+tree[2*k+1].sum;
}
void update(int k,int l,int r,int v){
    if(l<=tree[k].l&&r>=tree[k].r){
        lazy[k]+=v*(tree[k].r-tree[k].l+1);
        return;
    }
    int mid=(tree[k].l+tree[k].r)/2;
    if(l<=mid) update(2*k,l,mid,v);
    if(r>mid) update(2*k+1,mid+1,r,v);
    tree[k].sum=tree[2*k].sum+tree[2*k+1].sum;
}
int query(int x,int y,int k,int l,int r){
    tree[k].sum+=lazy[k];
    if(x<=tree[k].l&&y>=tree[k].r) return tree[k].sum;
    int mid=(tree[k].l+tree[k].r)/2,sum=0;
    if(l<=mid) lazy[2*k]+=lazy[k],sum+=query(x,y,2*k,l,mid);
    if(r>mid) lazy[2*k+1]+=lazy[k],sum+=query(x,y,2*k+1,mid+1,r);
    lazy[k]=0;
    return sum;
}
signed main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++) cin>>a[i];
    build(1,1,n);
    while(m--){
        cin>>opt;
        if(opt==1){
            cin>>x>>y>>z;
            update(1,x,y,z);
        }
        else if(opt==2){
            cin>>x>>y;
            cout<<query(x,y,1,x,y)<<endl;
        }
    }
    return 0;
}

by Genius_Star @ 2024-12-18 17:51:25

建议好好看下题解,你这错完了


|