刚学线段树,70分tle求调
查看原帖
刚学线段树,70分tle求调
719140
only_joker楼主2023/12/28 18:07
#include<bits/stdc++.h>
using namespace std;
long long ma[400025],a[100005],n,m,z,x,y,kk,sum; 
void build(long long k,long long l,long long r){
	if(l==r)
	{
		ma[k]=a[l];
		return;
	}
	long long mid=(l+r)/2;
	build(k*2,l,mid);
	build(k*2+1,mid+1,r);
	ma[k]=ma[k*2]+ma[k*2+1];
}
void query(long long k,long long l,long long r,long long x,long long y){
	if(l>y||r<x) return;
	if(l>=x&&r<=y)
	{
		sum+=ma[k];
		return; 
	}
	if(r>y||l<x)
	{
		long long mid=(l+r)/2;
		query(k*2,l,mid,x,y);
		query(k*2+1,mid+1,r,x,y);
	}
}
void query1(long long k,long long l,long long r,long long x,long long y){
	if(l>y||r<x) return;
	if(l==r)
	{
		ma[k]+=kk;
		return; 
	}
	long long mid=(l+r)/2;
	query1(k*2,l,mid,x,y);
	query1(k*2+1,mid+1,r,x,y);
	ma[k]=ma[k*2]+ma[k*2+1];
}
int main(){
	cin>>n>>m;
	for(long long i=1;i<=n;i++)
	{
		cin>>a[i];
	}
	build(1,1,n);
	for(long long i=1;i<=m;i++)
	{
		sum=0;
		cin>>z;
		if(z==1)
		{
			cin>>x>>y>>kk;
			query1(1,1,n,x,y);
		}
		else
		{
			cin>>x>>y;
			query(1,1,n,x,y);
			cout<<sum<<endl;
		}
	}
}

悬赏一关,在线

2023/12/28 18:07
加载中...