萌新全部wa求调
查看原帖
萌新全部wa求调
601142
hnoi楼主2023/10/18 23:38
#include <bits/stdc++.h>
#define ll long long
using namespace std;
int const maxn=10e5+5;
int a[maxn],mi[4*maxn];
int lz[4*maxn];
inline ll ls(ll x){
	return x<<1;
}
inline ll rs(ll x){
	return x<<1|1;
}
inline void push_up(ll p)
{
    mi[p]=mi[ls(p)]+mi[rs(p)];
}
void build(ll p,ll l,ll r){
	lz[p]=0;
	if(l==r) {
		mi[p]=a[l];
		return ;
	}
	ll mid=(l+r)>>1;
	build(ls(p),l,mid);
	build(rs(p),mid+1,r);
}
//void change (int k,int l,int r,int x,int v){//单点修改(建树) 
//	if(x>r||x<l) return;
//	if(l==r&&l==x)
//	{
//		mi[k]+=v;
//		return;
//	}
//	int mid=(l+r)/2;
//	change(2*k,l,mid,x,v);
//	change(2*k+1,mid+1,r,x,v);
//	push_up(k);
//}
inline void f(ll p,ll l,ll r,ll k){
	lz[p]=lz[p]+k;
	mi[p]+=k*(r-l+1);
}
inline void push_down(ll p,ll l,ll r){
	ll mid=(l+r)>>1;
	f(ls(p),l,mid,lz[p]);
	f(rs(p),mid+1,r,lz[p]);
	lz[p]=0;
}
void update(int k,int l,int r,int x,int y,int t){//区间修改 
	//l,r为要修改的区间
	//x,y为当前节点存储的区间 
	if(l<=x&&y<=r){
		mi[k]+=(y-x+1)*t;
		lz[k]+=t;
		return;
	}
	push_down(k,x,y);
	int mid=(x+y)>>1;
	if(l<=mid) update(ls(k),l,r,x,mid,t);
	if(r>mid) update(rs(k),l,r,mid+1,y,t);
	push_up(k);
}
long long getsum (int k,int l,int r,int x,int y){//(区间查询-求和) 
	ll res=0;
	if(x<=l&&r<=y) return mi[k];
	int mid=(l+r)/2;
	push_down(k,l,r);
	if(x<=mid) res+=getsum(ls(k),l,mid,x,y);
	if(y>mid) res+=getsum(rs(k),mid+1,r,x,y);
	return res;
}

int main(){
	long long ans=0;
	int n,m;
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++){
		scanf("%d",&a[i]);
//		change(1,1,n,i,a[i]);
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int f,x,y;
		scanf("%d%d%d",&f,&x,&y);
		if(f==1){
			int k;
			scanf("%d",&k);
			update(1,1,n,x,y,k);
		}
		else{
			cout<<getsum(1,1,n,x,y)<<endl;
		}
	}
}
2023/10/18 23:38
加载中...