求助!
查看原帖
求助!
398818
Candycar楼主2022/7/14 16:08

求各位神犇纠错,到底哪里错了啊?调了好久没查出来/kk

#include<bits/stdc++.h>
using namespace std;
#define int long long
#define ls i<<1
#define rs i<<1|1
const int MAXN=100005;
int n,m;
int A[MAXN];
struct node{
	int l,r,w;
	int tg;
}tree[MAXN<<2];
void build(int l,int r,int i){
	tree[i].l=l,tree[i].r=r;
	if(l==r){
		tree[i].w=A[l];
		return ;
	}
	int mid=l+r>>1;
	build(l,mid,ls);
	build(mid+1,r,rs);
	tree[i].w=tree[ls].w+tree[rs].w;
}
void push_down(int i){
	if(tree[i].tg){
		tree[ls].w+=tree[i].tg*(tree[ls].r-tree[ls].l+1);
		tree[rs].w+=tree[i].tg*(tree[rs].r-tree[rs].r+1);
		tree[ls].tg+=tree[i].tg;
		tree[rs].tg+=tree[i].tg;
		tree[i].tg=0;
	}
}
void update(int l,int r,int k,int i){
	if(l<=tree[i].l&&r>=tree[i].r){
		tree[i].w+=k*(tree[i].r-tree[i].l+1);
		tree[i].tg+=k;
		return; 
	}
	push_down(i);
	int mid=tree[i].l+tree[i].r>>1;
	if(l<=mid)update(l,r,k,ls);
	if(r>mid)update(l,r,k,rs);
	tree[i].w=tree[ls].w+tree[rs].w;
}
int query(int l,int r,int i){
	if(l<=tree[i].l&&r>=tree[i].r)return tree[i].w;
	push_down(i);
	int mid=tree[i].l+tree[i].r>>1;
	int res=0;
	if(l<=mid)res+=query(l,r,ls);
	if(r>mid)res+=query(l,r,rs); 
	return res;
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++)cin>>A[i];
	build(1,n,1);
	while(m--){
		int op;
		cin>>op;
		if(op==1){
			int x,y,k;
			cin>>x>>y>>k;
			update(x,y,k,1);
		}
		else{
			int x,y;
			cin>>x>>y;
			cout<<query(x,y,1)<<endl;
		}
	}
	return 0;	
}
2022/7/14 16:08
加载中...