样例过0pts 求助
查看原帖
样例过0pts 求助
285370
绝尘影_Sheldow楼主2022/11/24 21:12

RT Code:

//head
#include<iostream>
using namespace std;
//update the tree
struct ltr
{
	long long w,tag;
}tr[414514];
int n,m,x,y,op;
long long k,a[114514];
void upd(int u)
{
	tr[u].w=tr[u*2].w+tr[u*2+1].w;
}
void build(int u,int l,int r)
{
	if(l==r)
	{
		tr[u].w=a[l];
		return;
	}
	build(u*2,l,(l+r)/2);
	build(u*2+1,(l+r)/2+1,r);
	upd(u);
}
//plus a number to a range
bool ifcontained(int ll,int rr,int l,int r) {return (l<=ll)&&(r>=rr);}
bool ifnotrelated(int ll,int rr,int l,int r) {return (ll>r)||(rr<l);}
void maketag(int u,int len,long long num)
{
	tr[u].tag+=num;
	tr[u].w+=len*num;
}
void pushdown(int u,int l,int r)
{
	maketag(u*2,(l+r)/2-l+1,tr[u].tag);
	maketag(u*2+1,r-(l+r)/2,tr[u].tag);
	tr[u].tag=0;
}
void add(int u,int ll,int rr,int l,int r,long long num)
{
	if(ifcontained(ll,rr,l,r))
	{
		maketag(u,ll-rr+1,num);
	}
	else if(!ifnotrelated(ll,rr,l,r))
	{
		pushdown(u,ll,rr);
		add(u*2,ll,(ll+rr)/2,l,r,num);
		add(u*2+1,(ll+rr)/2+1,rr,l,r,num);
		upd(u);
	}
}
//search the answer
long long search(int u,int ll,int rr,int l,int r)
{ 
	if(ifcontained(ll,rr,l,r)) return tr[u].w;
	if(!ifnotrelated(ll,rr,l,r)) 
    {
        pushdown(u,ll,rr);
        return search(u*2,ll,(ll+rr)/2,l,r)+search(u*2+1,(ll+rr)/2+1,rr,l,r);
    }
	return 0;
}
//main code
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(int i=1;i<=m;i++)
	{
		cin>>op;
		if(op==1)
		{
			cin>>x>>y>>k;
			add(1,1,n,x,y,k);
		}
		if(op==2)
		{
			cin>>x>>y;
			cout<<search(1,1,n,x,y)<<endl; 
		}
	}
}
// YEEEEES!
2022/11/24 21:12
加载中...