最后三点WA了
查看原帖
最后三点WA了
1057695
pjfffb楼主2023/11/1 21:31

大佬帮忙看看代码

求助

#include<bits/stdc++.h>
using namespace std;
const int N=1e5+9;
long long n,m,a[N],b,x,y,v;
long long res;
struct node{
	long long l,r,w,f;
}tree[4*N+1];
void build(int k,int l,int r) 
{
    tree[k].l=l,tree[k].r=r;
    if(tree[k].l==tree[k].r)
    {
        tree[k].w=a[l];
        return;
    }
    int m=(l+r)/2;
    build(k*2,l,m);
    build(k*2+1,m+1,r);
    tree[k].w=tree[k*2].w+tree[k*2+1].w;
}
void down(int k){
	tree[k*2].f+=tree[k].f;
    tree[k*2+1].f+=tree[k].f;
    tree[k*2].w+=tree[k].f*(tree[k*2].r-tree[k*2].l+1);
    tree[k*2+1].w+=tree[k].f*(tree[k*2+1].r-tree[k*2+1].l+1);
    tree[k].f=0;
}
void add(int k){
	if(tree[k].l>y||tree[k].r<x) return;
	if(tree[k].l>=x&&tree[k].r<=y){
		tree[k].w+=(tree[k].r-tree[k].l+1)*v;
		tree[k].f+=v;
		return;
	}
	if(tree[k].f>0) down(k);
	int mid=(tree[k].l+tree[k].r)/2;
	if(x<=mid) add(2*k);
	if(y>mid) add(2*k+1);
	tree[k].w=tree[2*k].w+tree[2*k+1].w;
}

int ask(int x,int y,int k)
{
	if(tree[k].l>y||tree[k].r<x) return 0;
    if(tree[k].l>=x&&tree[k].r<=y) return tree[k].w;
    if(tree[k].f>0) down(k);
    return (long long)ask(x,y,k*2)+ask(x,y,k*2+1);
}
int main(){
	//freopen("1.in","r",stdin);
	//freopen("1.out","w",stdout);
	cin>>n,cin>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
	}
	build(1,1,n);
	while(m--){
		cin>>b,cin>>x,cin>>y;
		res=0;
		if(b==1){
			cin>>v;
			add(1);
		}
		else printf("%lld\n",ask(x,y,1));
	}
}
2023/11/1 21:31
加载中...