求助!70分(用的是永久标记法),3个WA,读到的是‘-’
查看原帖
求助!70分(用的是永久标记法),3个WA,读到的是‘-’
198515
jlg006728楼主2021/7/26 11:24
#include<bits/stdc++.h>
using namespace std;
long long n,m;
long long a[100050],add[800050];
long long sum[800050];
#define ll long long
inline int read()
{
	register int x=0,t=1;
	register char ch=getchar();
	while(ch<'0'||ch>'9')
	{
		if(ch=='-')t=-1;
		ch=getchar();
	}
	while(ch>='0'&&ch<='9')
	{
		x=(x<<1)+(x<<3)+(ch^48);
		ch=getchar();
	}
	return x*t;
}
inline void write(int x)
{
	if(x<0)
	{
		putchar('-');
		x=-x;
	}
	if(x>9)write(x/10);
	putchar(x%10+'0');
}
void build(ll k,ll l,ll r,ll p,ll v)
{
	if(p<l||p>r)return;
	if(p==l&&r==l)
	{
		sum[k]=v;return;
	}
	long long mid=(l+r)>>1;
	build(k<<1,l,mid,p,v);
	build((k<<1)+1,mid+1,r,p,v);
	sum[k]=sum[k<<1]+sum[(k<<1)+1];
}
void addv(ll k,ll l,ll r,ll x,ll y,ll v)
{
	long long mid=0;
	if(x>r||y<l)return;
	if(x<=l&&y>=r)
	{
		add[k]+=v;
		return;
	}
	mid=(l+r)>>1;
	sum[k]+=(min(y,r)-max(x,l)+1)*v;
	if(x<=mid)addv(k*2,l,mid,x,y,v);
	if(mid<y)addv(k*2+1,mid+1,r,x,y,v);
}
long long query(ll k,ll l,ll r,ll x,ll y)
{
	long long res=0,mid=0;
	if(x>r||y<l)return 0;
	if(x<=l&&y>=r)
	{
		return sum[k]+(min(r,y)-max(x,l)+1)*add[k];
	}
	mid=(l+r)>>1;
	res=(min(r,y)-max(x,l)+1)*add[k];
	if(x<=mid)res+=query(k*2,l,mid,x,y);
	if(mid<y)res+=query(k*2+1,mid+1,r,x,y);
	return res;
}
int main()
{
	long long choice,q,w,e;
	n=read();m=read();
	for(int i=1;i<=n;i++)
	{
		a[i]=read();
		build(1,1,n,i,a[i]);
	}
	for(int i=1;i<=m;i++)
	{
		choice=read();
		q=read();
		w=read();
		if(choice==1)
		{
			e=read();
			addv(1,1,n,q,w,e);
		}
		else if(choice==2)
		{
			write(query(1,1,n,q,w));
			cout<<endl;
		}
	}
	return 0;
}
2021/7/26 11:24
加载中...