甚么问题
查看原帖
甚么问题
1045168
NSZBD_dklmq12楼主2024/10/25 20:06
#include<bits/stdc++.h>
#define ll long long
using namespace std;
ll _,x,y,k,n,m,a[101000],tree[101000<<2],laz[101000<<2];
priority_queue<ll>q;
void push_down(ll l,ll r,ll lx){
	ll mid=(l+r)>>1;
	tree[lx*2]+=(mid-l+1)*laz[lx];
	tree[lx*2+1]+=(r-(mid+1)+1)*laz[lx];
	laz[lx*2]=laz[lx];
	laz[lx*2+1]=laz[lx];
	laz[lx]=0;
}
void build(ll l,ll r,ll lx){
	if(l==r){
		tree[lx]=a[l];
		return;
	}
	ll mid=(l+r)>>1;
	build(l,mid,lx*2);
	build(mid+1,r,lx*2+1);
	tree[lx]=tree[lx*2]+tree[lx*2+1];
}
void add(ll l,ll r,ll addl,ll addr,ll addk,ll lx){
	if(addl<=l&&r<=addr){
		tree[lx]+=addk*(r-l+1);
		laz[lx]+=addk;
		return;
	}
	push_down(l,r,lx);
	ll mid=(l+r)>>1;
	if(addl<=mid) add(l,mid,addl,addr,addk,lx*2);
	if(mid+1<=addr) add(mid+1,r,addl,addr,addk,lx*2+1);
	tree[lx]=tree[lx*2]+tree[lx*2+1];
}
ll query(ll l,ll r,ll ql,ll qr,ll lx){
	if(ql<=l&&r<=qr) return tree[lx];
	push_down(l,r,lx);
	ll mid=(l+r)>>1,cns=0;
	if(ql<=mid) cns+=query(l,mid,ql,qr,lx*2);
	if(mid+1<=qr) cns+=query(mid+1,r,ql,qr,lx*2+1);
	return cns;
}
int main(){
//	freopen("CSPrp++.in","r",stdin);
//	freopen("CSPrp++.out","w",stdout);
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>a[i];
	build(1,n,1);
	for(int i=1;i<=n;i++){
		cin>>_>>x>>y;
		if(_==1){
			cin>>k;
			add(1,n,x,y,k,1);
//			for(int j=1;j<=15;j++) cout<<tree[j]<<' ';
//			cout<<endl;
		}
		else{
			cout<<query(1,n,x,y,1)<<endl;
		}
	}
//	fclose(stdin);
//	fclose(stdout);
	return 0;
} 

WA,0ptsWA,0pts

2024/10/25 20:06
加载中...