为什么我只有 9 分
查看原帖
为什么我只有 9 分
490484
include13_fAKe楼主2024/7/7 16:42
#include<bits/stdc++.h>
#define int long long
using namespace std;

int n,m;
int a[114514];
int qzh[114514];
struct node{
	int id;
	int l;
	int r;
	int tag;
	int sum;
}tree[4*114514];
void pushup(int now){
	tree[now].sum=tree[now*2].sum+tree[now*2+1].sum;
}
void pushdown(int now){
	tree[now*2].tag+=tree[now].tag;
	tree[now*2].sum+=tree[now].tag*(tree[now*2].r-tree[now*2].l+1);
	tree[now*2+1].tag+=tree[now].tag;
	tree[now*2+1].sum+=tree[now].tag*(tree[now*2+1].r-tree[now*2+1].l+1);
	tree[now].tag=0;
}
void build(int now,int l,int r){
//	cout<<now<<" "<<l<<" "<<r<<endl;
	tree[now].id=now;
	tree[now].l=l;
	tree[now].r=r;
	if(l==r){
		tree[now].sum=qzh[l];
		return;
	}	
	int mid=l+r>>1;
	build(now*2,l,mid);
	build(now*2+1,mid+1,r);
	pushup(now);
	return;
}
void modify(int now,int l,int r,int k){
//	cout<<now<<' '<<l<<' '<<r<<' '<<k<<endl;
	int l1=tree[now].l;
	int r1=tree[now].r;
	pushdown(now);
	if(l1==l&&r1==r){
//		cout<<l1<<' '<<r1<<endl;
		tree[now].tag+=k;
		tree[now].sum+=k*(r1-l1+1);
		return;
	}
	int mid=l1+r1>>1;
	if(l<=mid)	modify(now*2,l,min(mid,r),k);
	if(r>mid)	modify(now*2+1,max(mid+1,l),r,k);
	pushup(now);
	return;
}
int query(int now,int l,int r){
	int l1=tree[now].l;
	int r1=tree[now].r;
	pushdown(now);
	if(l1==l&&r1==r){
		return tree[now].sum;
	}
	int mid=l1+r1>>1;
	int ans=0;
	if(l<=mid)	ans+=query(now*2,l,min(mid,r));
	if(r>mid)	ans+=query(now*2+1,max(l,mid+1),r);
	pushup(now);
	return ans; 
}
signed main(){
	cin>>n>>m;
	for(int i=1;i<=n;i++){
		cin>>a[i];
		qzh[i]=a[i]-a[i-1]; 
	}
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op;
		cin>>op;
		if(op==1){
			int l,r,k,d;
			cin>>l>>r>>k>>d;
			modify(1,l,l,k);
//			cout<<endl;
			if(l<r)	modify(1,l+1,r,d);
		}
		else{
			int p;
			cin>>p;
			cout<<query(1,1,p)<<endl;
		}
	}
	return 0;
}
2024/7/7 16:42
加载中...