求助,0分WA
查看原帖
求助,0分WA
1074622
jiyecheng楼主2024/12/3 21:50

代码:

#include <bits/stdc++.h>
using namespace std;
struct node
{
	int data,left,right,tw;
}a[1000001];
void build(int u,int l,int r)
{
	a[u].left=l;
	a[u].right=r;
	if(l==r)
	{
		cin>>a[u].data;
		return ;
	}
	int mid=(l+r)/2;
	build(u*2,l,mid);
	build(u*2+1,mid+1,r);
	a[u].data=a[u*2].data+a[u*2+1].data;
}
void xb(int u)
{
	a[u*2].data+=a[u].tw*(a[u*2].right-a[u*2].left+1);
	a[u*2+1].data+=a[u].tw*(a[u*2+1].right-a[u*2+1].left+1);
	a[u*2].tw+=a[u].tw;
	a[u*2+1].tw+=a[u].tw;
	a[u].tw=0;
}
int query(int u,int l,int r)
{
	if(a[u].left>=l && a[u].right<=r)return a[u].data;
	xb(u);
	int s=0;
	if(l<=a[u*2].right)s+=query(u*2,l,r);
	if(r>=a[u*2+1].left)s+=query(u*2+1,l,r);
	return s;
}
void add(int u,int l,int r,int mi)
{
	//cout<<u<<" "<<l<<" "<<r<<" "<<mi<<'\n';
	if(a[u].left==l && a[u].right==r)
	{
		a[u].data+=mi*(a[u].right-a[u].left+1);
		a[u].tw+=mi;
		return ;
	}
	if(l<=a[u*2].right)add(u*2,l,a[u*2].right,mi);
	if(r>=a[u*2+1].left)add(u*2+1,a[u*2+1].left,r,mi);
	a[u].data=a[u*2].data+a[u*2+1].data;
}
int main()
{
	int n,m;
	cin>>n>>m;
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		int type,l,r,mi;
		cin>>type>>l>>r;
		if(type==1){cin>>mi;add(1,l,r,mi);}
		if(type==2)cout<<query(1,l,r)<<'\n';
	}
	return 0;
}

2024/12/3 21:50
加载中...