刚学OI $10^{-998244353}$ ms,线段树全 T 求助
查看原帖
刚学OI $10^{-998244353}$ ms,线段树全 T 求助
307453
云浅知处はなび楼主2020/7/7 19:40

样例可过。

记录

这里是代码:

#include<cstdio>
#include<algorithm>
#include<cctype>
#include<cstring>
#include<cstdlib>

#define MAXN 100005
#define lson(o) (o<<1)
#define rson(o) (o<<1|1)

#define gc getchar()
#define id(ch) (ch>='0'&&ch<='9')

using namespace std;

int a[MAXN],n,m,cf[MAXN];

inline int read(){
	int w=0,f=1;char ch=gc;
	while(!(id(ch)))if(ch=='-')f=-1,ch=gc;
	while(id(ch))w=(w<<1)+(w<<3)+(ch-'0'),ch=gc;
	return w*f;
}

struct SMT{

	int sumv[MAXN<<2];
	int plz[MAXN<<2];

	inline void pushup(int o){
		sumv[o]=sumv[lson(o)]+sumv[rson(o)];
	}

	inline void build(int l,int r,int o){
		if(l==r){
			sumv[o]=cf[l];
			return ;
		}
		int mid=(l+r)>>1;
		build(l,mid,lson(o));
		build(mid+1,r,rson(o));
		pushup(o);
	}

	inline void pushdown(int ql,int qr,int o){
		int mid=(ql+qr)>>1;
		sumv[lson(o)]+=(mid-ql+1)*plz[o];
		sumv[rson(o)]+=(qr-mid)*plz[o];
		plz[lson(o)]+=plz[o];
		plz[rson(o)]+=plz[o];
		plz[o]=0;
	}

	inline void change(int l,int r,int k,int ql,int qr,int o){
		if(l<=ql&&qr<=r){
			sumv[o]+=(qr-ql+1)*k;
			plz[o]+=k;
			return ;
		}
		pushdown(ql,qr,o);
		int mid=(ql+qr)>>1;
		if(l<=mid)change(l,r,k,ql,mid,lson(o));
		if(r>mid)change(l,r,k,mid+1,qr,rson(o));
	}

	inline int QrySum(int l,int r,int ql,int qr,int o){
		if(l<=ql&&qr<=r){
			return sumv[o];
		}
		pushdown(ql,qr,o);
		int mid=(ql+qr)>>1;
		int ans=0;
		if(l<=mid)ans+=QrySum(l,r,ql,mid,lson(o));
		if(r>mid)ans+=QrySum(l,r,mid+1,qr,rson(o));
		return ans;
	}

};

SMT tree;

int main(void){

	n=read();
	m=read();

	for(int i=1;i<=n;i++){
		a[i]=read();
		cf[i]=a[i]-a[i-1];
	}

	tree.build(1,n,1);

	while(m--){
		int opt,l,r,d,k,p;
		opt=read();
		if(opt==1){
			l=read(),r=read(),k=read(),d=read();
			cf[l]+=k;
			cf[r+1]+=(l-r)*d-k;
			tree.change(l,r,d,1,n,1);
		}
		else{
			p=read();
			printf("%d\n",a[p]+tree.QrySum(1,p,1,n,1));
		}
	}

	return 0;
}
2020/7/7 19:40
加载中...