线段树做法求调(30pts,WA)
查看原帖
线段树做法求调(30pts,WA)
165676
PRXOR楼主2024/1/22 09:27

样例可过

#include<bits/stdc++.h>
using namespace std;
const int X=2000010;
int n,m,cnt=0,st[X];
struct point
{
	int ls,rs,sum,ln,rn;
} p[X];
point _point(int _ls,int _rs,int _sum,int _ln,int _rn)
{
	point tmp;
	tmp.ls=_ls,tmp.rs=_rs,tmp.sum=_sum,tmp.ln=_ln,tmp.rn=_rn;
	return tmp;
}
int build(int _l,int _r)
{
	if(_l==_r)
	{
		p[++cnt]=_point(-1,-1,st[_l],_l,_r);
		return cnt;
	}
	int m=(_l+_r)/2,ncnt=++cnt;
	int nls=build(_l,m),nrs=build(m+1,_r);
	p[ncnt]=_point(nls,nrs,0,_l,_r);
	return ncnt;
}
void Add(int nx,int ny,int k,int now)
{
	if(nx<=p[now].ln&&ny>=p[now].rn)
	{
		p[now].sum+=k;
		return ;
	}
	int m=(p[now].ln+p[now].rn)/2;
	if(nx<=m) Add(nx,m,k,p[now].ls);
	if(m+1<=ny) Add(m+1,ny,k,p[now].rs);
	return ;
}
void Print(int x,int now,int added)
{
	if(p[now].ln==p[now].rn&&p[now].rn==x)
	{
		printf("%d\n",added+p[now].sum);
		return ;
	}
	int m=(p[now].ln+p[now].rn)/2;
	if(x<=m) Print(x,p[now].ls,added+p[now].sum);
	else Print(x,p[now].rs,added+p[now].sum);
	return ;
}
int main()
{
	cin>>n>>m;
	for(int i=1;i<=n;i++) cin>>st[i];
	build(1,n);
	while(m--)
	{
		int s;
		cin>>s;
		if(s==1)
		{
			int x,y,k;
			cin>>x>>y>>k;
			Add(x,y,k,1);
		}
		else
		{
			int x;
			cin>>x;
			Print(x,1,0);
		}
	}
	return 0;
}

只对了1,3,4

2024/1/22 09:27
加载中...