标记下传线段树 0tps 求调,悬关
查看原帖
标记下传线段树 0tps 求调,悬关
1405718
JoyLosingK楼主2024/8/20 11:30
#include<bits/stdc++.h>
using namespace std;
#define int long long 
#define mid (l+r>>1)
const int N=1e5+7;
int a[N],sum[N*4],add[N*4],m,op,t,g,c,n;
inline int read(){
	int x=0,f=1;char ch=getchar();
	for(;!isdigit(ch);ch=getchar()) if(ch=='-') f=-1;
	for(;isdigit(ch);ch=getchar()) x=x*10+ch-'0';
	return x*f;}
void maketree(int k,int l,int r){
	if(l==r){sum[k]=a[r];return;}
	maketree(k<<1,l,mid),maketree(k<<1|1,mid+1,r);
	sum[k]=sum[k<<1]+sum[k<<1|1]; return;}
void Add(int k,int l,int r,int v){
	add[k]+=v,sum[k]+=(r-l+1)*v; return;}
void pushdown(int k,int l,int r){
	if(!add[k]) return;
	Add(k<<1,l,mid,add[k]),Add(k<<1|1,mid+1,r,add[k]);
	add[k]=0; return;}
void modifly(int k,int l,int r,int x,int y,int v){
	if(r<x||y<l) return;
	if(l>=x&&r<=y){Add(k,l,r,v);return;} 
	pushdown(k,l,r);
	if(x<=mid) modifly(k<<1,l,mid,x,y,v);
	if(mid<y)  modifly(k<<1|1,mid+1,r,x,y,v);
	sum[k]=sum[k<<1]+sum[k<<1|1]; return;}
int query(int k,int l,int r,int x,int y){
	if(r<x||y<l) return 0;
	if(l>=x&&r<=y) return sum[k];
	int res=0; pushdown(k,l,r);
	if(x<=mid) res+=query(k<<1,l,mid,x,y);
	if(mid<y)  res+=query(k<<1|1,mid+1,r,x,y);
	return res;}
main()
{   n=read(),m=read();
	for(int i=1;i<=n;i++) a[i]=read();
	maketree(1,1,n);
	while(m--){ op=read();
		if(op==1)modifly(1,1,n,t=read(),g=read(),c=read());
		else cout<<query(1,1,n,t=read(),g=read())<<endl;
	} return 0;
}
2024/8/20 11:30
加载中...