线段树写挂了,不知道哪里错了
  • 板块灌水区
  • 楼主Eydte
  • 当前回复3
  • 已保存回复3
  • 发布时间2022/10/18 17:45
  • 上次更新2023/10/27 07:00:15
查看原帖
线段树写挂了,不知道哪里错了
359057
Eydte楼主2022/10/18 17:45
#include <bits/stdc++.h>
#define freopen(x) freopen(#x".in","r",stdin);freopen(#x".out","w",stdout);
#define foru(i,j,k) for(register int i=j;i<=k;i++)
#define ford(i,j,k) for(register int i=j;i>=k;i--)
#define ps(x) puts(#x)
#define ll long long
#define int long long
#define N 1000005
inline ll read(){register char ch=getchar();register ll s=0;while(!isdigit(ch))ch=getchar();while(isdigit(ch)){s=(s<<3)+(s<<1)+(ch^48);ch=getchar();}return s;}
inline void print(ll x){if(x<0)putchar('-');if(x>9)print(x/10);putchar(x%10+48);} 
using namespace std;
int n,cz,opt,x,y,k;
int a[N],t[4*N],tag[4*N];
inline int ls(int p){return p<<1;}
inline int rs(int p){return p<<1|1;}
inline void push_up(int p){t[p]=t[ls(p)]+t[rs(p)];}
void build(int l,int r,int p)
{
	if(l==r)t[p]=a[l];
	int m=(l+r)>>1;
	build(l,m,ls(p));
	build(m+1,r,rs(p));
	push_up(p);
}
inline void f(int p,int l,int r,int k)
{
	tag[p]+=k;
	t[p]+=k*(r-l+1);
}
inline void push_down(int p,int l,int r)
{
	int m=(l+r)>>1;
	f(ls(p),l,m,tag[p]);
	f(rs(p),m+1,r,tag[p]);
	tag[p]=0;
}
void add(int qx,int qy,int l,int r,int p,int k)
{
	if(qx<=l&&r<=qy)
	{
		tag[p]+=k;
		t[p]+=k*(r-l+1);
		return;
	}
	push_down(p,l,r);
	int m=(l+r)>>1;
	if(qx<=m)add(qx,qy,l,m,ls(p),k);
	if(qy>m)add(qx,qy,m+1,r,rs(p),k);
	push_up(p);
}
ll query(int qx,int qy,int l,int r,int p)
{
	ll res=0;
	if(qx<=l&&r<=qy)return t[p];
	int mid=(l+r)>>1;
	push_down(p,l,r);
	if(qx<=mid)res+=query(qx,qy,l,mid,ls(p));
	if(qy>mid) res+=query(qx,qy,mid+1,r,rs(p));
	return res;
}
signed main()
{
	n=read(),cz=read();
	foru(i,1,n)a[i]=read();
	build(1,n,1);
	while(cz--)
	{
		opt=read(),x=read(),y=read();
		if(opt==1)k=read(),add(x,y,1,n,1,k);
		else print(query(x,y,1,n,1)),ps();
	}
	return 0;
}
2022/10/18 17:45
加载中...