救救孩子吧,为什么全都wa了
查看原帖
救救孩子吧,为什么全都wa了
1300596
Kyoma_T楼主2024/4/29 21:42
#include<cstdio>
#include<iostream>
#include<algorithm> 
#include<cstring>
#include<stack>
#include<queue>
using namespace std;
const int N=1e5+10;
int a[N];
long long ans=0;
int n,q;
struct node{
	int l;
	int r;
	long long sum;
	long long lz;
}tr[4*N];
void build(int p,int l,int r)
{
	tr[p].l=l,tr[p].r=r;tr[p].lz=0;
	if(l==r)
	{
	   tr[p].sum=a[l];
	   return;	
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid),build(p<<1|1,mid+1,r);
	tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
}
void push_down(int p)
{
	int k=tr[p].lz;
	if(tr[p].lz!=0)
	{
		tr[p<<1].sum+=k*(tr[p<<1].r-tr[p<<1].l+1);
		tr[p<<1].lz+=k;
		//push_down(p<<1);
		tr[p<<1|1].sum+=k*(tr[p<<1|1].r-tr[p<<1|1].l+1);
		tr[p<<1|1].lz+=k;
		//push_down(p<<1|1);
		tr[p].lz=0;
	}
	return;
}
void modify(int p,int l,int r,int x)
{
	int a=tr[p].l,b=tr[p].r;
	if(tr[p].l>=l&&tr[p].r<=r)
	{
		tr[p].sum+=x*(b-a+1);
		tr[p].lz+=x;
		//push_down(p);
		return;
    }
	int mid=(tr[p].l+tr[p].r)>>1;
	if(l<=mid)modify(p<<1,l,r,x);
	if(r>=mid+1)modify(p<<1|1,l,r,x);
	tr[p].sum=tr[p<<1].sum+tr[p<<1|1].sum;
	return;
 }
long long query(int p,int l,int r)
 {
 	//printf("%d %d %d",p,l,r);
 	if(tr[p].l>=l&&tr[p].r<=r)
 	{
 		return tr[p].sum;
 		//printf("%d %d %d %d %d\n",tr[p].l,tr[p].r,l,r,tr[p].sum);
 		//printf("%d\n",r);
	 }
	 push_down(p);
	 long long s=0;
	 int mid=tr[p<<1].r;
	 //printf("mid=%d\n",mid);
	 if(l<=mid)
	 {
	 	//printf("l=%d<mid=%d\n",l,mid);
	 	//printf("%d %d %d %d %d\n",tr[p].l,tr[p].r,l,r,tr[p].sum);
	 	s+=query(p<<1,l,mid);
	 	//printf("%d\n",mid); 
	 }
	 if(r>mid)
	 {
	 	//printf("r=%d>mid=%d\n",r,mid);
	 	//printf("%d %d %d %d %d\n",tr[p].l,tr[p].r,l,r,tr[p].sum);
	 	s+=query(p<<1|1,mid+1,r);
	 	//printf("%d %d %d\n",tr[p<<1|1].r,r,mid+1);
	 }
	 return s;
} 

int main()
{
	
	scanf("%d%d",&n,&q);
	for(int i=1;i<=n;i++)
	scanf("%d",&a[i]);
	build(1,1,n);
	//for(int i=1;i<=4*n;i++)
	//		printf("%d %d %d\n",tr[i].l,tr[i].r,tr[i].sum);
	while(q--)
	{
		int k;
		scanf("%d",&k);
		if(k==1)
		{
			int l,r,x;
			scanf("%d%d%d",&l,&r,&x);
			modify(1,l,r,x);
			//for(int i=1;i<=4*n;i++)
			//printf("%d %d %d\n",tr[i].l,tr[i].r,tr[i].sum);
		}
		else if(k==2)
		{
			ans=0;
			int l,r;
			scanf("%d%d",&l,&r);
			printf("%lld\n",query(1,l,r));
		}
		
	}
	//for(int i=1;i<=4*n;i++)
	//		if(tr[i].l==tr[i].r&&tr[i].l!=0)printf("%d %d\n",tr[i].l,tr[i].sum);
	return 0;
} 
2024/4/29 21:42
加载中...