WA求助

P3372 【模板】线段树 1

Y_Naidong @ 2024-07-12 21:18:31

WA求助,样例过不了,看不出问题,求助大佬,HELP!!!

#include<bits/stdc++.h>
using namespace std;
const int N=1e7;
int n,m;
int a[N],tr[N],lazy[N];
void up(int ix){
    tr[ix]=tr[ix*2]+tr[ix*2+1];
}
void build(int l,int r,int ix){
    if(l==r){
        tr[ix]=a[l];
        return;
    }
    int mid=(l+r)/2;
    build(l,mid,ix*2);
    build(mid+1,r,ix*2+1);
    up(ix);
}
void down(int l,int r,int ix){
    if(lazy[ix]){
        lazy[ix*2]+=lazy[ix];
        lazy[ix*2+1]+=lazy[ix];
        int mid=(r+l)/2;
        tr[ix*2]+=lazy[ix]*(mid+1-l);
        tr[ix*2+1]+=lazy[ix]*(r-mid);
        lazy[ix]=0;
    }
}
void change(int l,int r,int ix,int x,int y,int k){
    if(l>=x&&r<=y){
        tr[ix]+=k*(r-l+1);
        lazy[ix]+=k;
        return;
    }
    down(l,r,ix);
    int mid=(r+l)/2;
    if(x<=mid)
        change(l,mid,ix*2,x,y,k);
    if(y>mid)
        change(mid+1,r,ix*2+1,x,y,k);
    up(ix); 
}
int find(int l,int r,int ix,int x,int y){
    if(l>=x&&r<=y)
        return tr[ix];
    int mid=(r+l)/2,ans=0;
    if(x<=mid)
        ans+=find(l,mid,ix*2,x,y);
    if(y>mid)
        ans+=find(mid+1,r,ix*2+1,x,y);
    return ans;
}
int main(){
    cin>>n>>m;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    build(1,n,1);
    for(int i=1;i<=m;i++){
        int p,x,y;
        cin>>p;
        if(p==1){
            int k;
            cin>>x>>y>>k;
            change(1,n,1,x,y,k);
        }
        if(p==2){
            cin>>x>>y;
            cout<<find(1,n,1,x,y)<<endl;
        }
    }
    return 0;
}

by Y_Naidong @ 2024-07-12 21:36:41

不用了,没开long long,答案爆了;(


|