线段树全WA求助
  • 板块学术版
  • 楼主Crazyouth
  • 当前回复0
  • 已保存回复0
  • 发布时间2022/8/10 09:37
  • 上次更新2023/10/27 16:11:00
查看原帖
线段树全WA求助
766339
Crazyouth楼主2022/8/10 09:37

rt,本蒟蒻线段树样例没过求助

#include <iostream>
#define ll long long
using namespace std;
const int maxn=100000;
int n,m,ans,input[500001];
struct node
{
	int left,right,num;
}tree[maxn<<2|1];
void build(ll left,ll right,ll index)
{
	tree[index].left=left;
	tree[index].right=right;
	if(left==right) return;
	ll mid=(left+right)/2;
	build(left,mid,index*2);
	build(mid+1,right,index*2+1);
}
int add(ll index)
{
	if(tree[index].left==tree[index].right)
	{
		tree[index].num=input[tree[index].right];
		return tree[index].num;
	}
	tree[index].num=add(index*2)+add(index*2+1);
	return tree[index].num;
}
void my_plus(ll index,ll l,ll r,ll k)
{
	if(tree[index].left>=l&&tree[index].right<=r)
	{
		tree[index].num+=k;
		return;
	}
	if(tree[index*2].right>=l) my_plus(index*2,l,r,k);
	if(tree[index*2+1].left<=r) my_plus(index*2+1,l,r,k);
}
void search(ll index,ll l,ll r)
{
	ans=0;
	if(tree[index].left>=l&&tree[index].right<=r)
	{
		ans+=tree[index].num;
		cout<<ans<<endl;
		return;
	}
	if(tree[index*2].right>=l) search(index*2,l,r);
	if(tree[index*2+1].left<=r) search(index*2+1,l,r);
}
int main()
{
	ll temp,x,y,k;
	cin>>n>>m;
	build(1,n,1); 
	for(int i=1;i<=n;i++)
	{
		cin>>input[i];
		add(i);
	}
	for(int i=1;i<=m;i++)
	{
		cin>>temp;
		if(temp==1)
		{
			cin>>x>>y>>k;
			my_plus(1,x,y,k);
		}
		else
		{
			cin>>x>>y;
			search(1,x,y);
		}
	}
	return 0;
}
2022/8/10 09:37
加载中...