线段树wa on#1~20求调
查看原帖
线段树wa on#1~20求调
1398428
gaozixuan666楼主2025/2/8 16:03
#include<bits/stdc++.h>
#define int long long
using namespace std;
const int N=2e5+5;
int n,m,a[N],ans[N<<2],tag[N<<2],op,x,y,k;
void push_up(int p){
    ans[p]=ans[p<<1]+ans[p<<1|1];
}
void build(int p,int l,int r){
    tag[p]=0;
    if(l==r){ans[p]=a[l];return ;}
    int mid=(l+r)>>1;
    build(p<<1,l,mid);
    build(p<<1|1,mid+1,r);
    push_up(p);
}
void f(int p,int l,int r,int k){
    tag[p]=tag[p]+k;
    ans[p]=ans[p]+k*(r-l+1);
}
void push_down(int p,int l,int r){
    int mid=(l+r)>>1;
    f(p<<1,l,mid,tag[p]);
    f(p<<1|1,mid+1,r,tag[p]);
    tag[p]=0;
}
void modify(int nl,int nr,int l,int r,int p,int k){
    if(nl<=l&&r<=nr){
        ans[p]+=k*(r-l+1);
        tag[p]+=k;
        return ;
    }
    push_down(p,l,r);
    int mid=(l+r)>>1;
    if(nl<=mid)modify(nl,nr,l,mid,p<<1,k);
    if(nr>mid) modify(nl,nr,mid+1,r,p<<1|1,k);
    push_up(p);
}
int query(int q_x,int q_y,int l,int r,int p){ 
	if(q_x>r||q_y<l)return 0;
    if(q_x<=l&&r<=q_y)return ans[p];
    int mid=(l+r)>>1;
    push_down(p,l,r);
    return (q_x<=mid?query(q_x,q_y,l,mid,p<<1):0)+(q_y>mid?query(q_x,q_y,mid+1,r,p<<1|1):0);
}
signed main(){
	scanf("%lld%lld",&n,&m);
	for(int i=1;i<=n;i++)scanf("%lld",&a[i]);
	build(1,1,n);
	while(m--){
		scanf("%lld",&op);
        if(op==1){
            scanf("%lld%lld%lld",&x,&y,&k);
            modify(x,y,1,n,1,k);
        }else if(op==2){
        	scanf("%lld",&k);
        	modify(1,1,1,1,1,k);
		}else if(op==3){
			scanf("%lld",&k);
			modify(1,1,1,1,1,-k);
		}else if(op==4){
			scanf("%lld%lld",&x,&y);
        	printf("%lld\n",query(x,y,1,n,1));
		}else {
			printf("%lld\n",query(1,1,1,n,1));
		}
    }
}
2025/2/8 16:03
加载中...