线段树满江红求调
  • 板块P2357 守墓人
  • 楼主wujingfey
  • 当前回复2
  • 已保存回复2
  • 发布时间2023/8/10 15:10
  • 上次更新2023/11/3 04:43:25
查看原帖
线段树满江红求调
637073
wujingfey楼主2023/8/10 15:10
#include<bits/stdc++.h>
#define int long long
using namespace std;
inline int read(){
	int res=0,f=1;char c=getchar();
	while(c<'0'||'9'<c){
		if(c=='-') f=-1;
		c=getchar();
	}
	while('0'<=c&&c<='9'){
		res=(res<<3)+(res<<1)+c-'0';
		c=getchar();
	}
	return f*res;
}
const int N=2e5+10;
int n,m,a[N];
struct Node{
	long long sum,l,r,tag;
}t[N<<3];
inline void push_up(int p){
	t[p].sum=t[p<<1].sum+t[p<<1|1].sum;
}
inline void build(int p,int l,int r){
	t[p].tag=0;
	t[p].l=l,t[p].r=r;
	if(l==r){
		t[p].sum=a[l];
		return;
	}
	int mid=(l+r)>>1;
	build(p<<1,l,mid);
	build(p<<1|1,mid+1,r);
	push_up(p);
}
inline int f(int p,int k){
	t[p].tag+=k;
	t[p].sum+=(t[p].r-t[p].l+1)*k;
}
inline int push_down(int p){
	f(p<<1,t[p].tag);
	f(p<<1|1,t[p].tag);
	t[p].tag=0;
}
inline void updata(int p,int nl,int nr,int k){
	if(nl<=t[p].l&&t[p].r<=nr){
		f(p,k);
		return;
	}
	push_down(p);
	int mid=(t[p].l+t[p].r)>>1;
	if(nl<=mid) updata(p<<1,nl,nr,k);
	if(mid<nr) updata(p<<1|1,nl,nr,k);
	push_up(p);
}
inline int query(int p,int nl,int nr){
	int res=0;
	if(nl<=t[p].l&&t[p].r<=nr){
		return t[p].sum;
	}
	int mid=(t[p].l+t[p].r)>>1;
	if(nl<=mid) res+=query(p<<1,nl,nr);
	if(mid<nr) res+=query(p<<1|1,nl,nr);
	return res;
}
signed main(){
	n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op=read();
		if(op==1){
			int a=read(),b=read(),c=read();
			updata(1,a,b,c);
		}else if(op==2){
			int a=read();
			updata(1,1,1,a);
		}else if(op==3){
			int a=read();
			updata(1,1,1,-a);
		}else if(op==4){
			int a=read(),b=read();
			printf("%lld\n",query(1,a,b));
		}else if(op==5){
			printf("%lld\n",query(1,1,1));
		}
	}
	return 0;
}
2023/8/10 15:10
加载中...