一个调的求
查看原帖
一个调的求
925506
ACRUSHj楼主2023/4/29 08:09

只过#1,求教教

#include<bits/stdc++.h>
#define ll long long
using namespace std;
const int N=1e5+10;
struct node{
	ll p,s;
}t[N<<2];
int n,m,a[N];
void update(int k,int l,int r,int w){
	t[k].p+=w;t[k].s+=(r-l+1)*w;
	return;
}
void pushdown(int k,int l,int r){
	int mid=l+r>>1;
	update(k<<1,l,mid,t[k].p);update(k<<1|1,mid+1,r,t[k].p);
	t[k].p=0;return;
}
void pushup(int k){
	t[k].s=t[k<<1].s+t[k<<1|1].s;
	return;
}
void build(int k,int l,int r){
	if(l==r){t[k].s=a[l];return;}
	int mid=l+r>>1;
	build(k<<1,l,mid);build(k<<1|1,mid+1,r);
	pushup(k);
	return;
}
void modify(int k,int l,int r,int x,int y,int z){
	if(l>y||r<x)return;
	if(l>=x&&r<=y){update(k,l,r,z);return;}
	int mid=l+r>>1;
	pushdown(k,l,r);
	if(mid>=x)modify(k<<1,l,mid,x,y,z);
	if(mid+1<=y)modify(k<<1|1,mid+1,r,x,y,z);
	pushup(k);
	return;
}
ll query(int k,int l,int r,int x,int y){
	if(l>y||r<x)return 0;
	if(l>=x&&r<=y)return t[k].s;
	pushdown(k,l,r);
	int mid=l+r>>1,ret=0;
	if(mid>=x)ret+=query(k<<1,l,mid,x,y);
	if(mid+1<=y)ret+=query(k,mid+1,r,x,y);
	return ret;
}
signed main(){
//	freopen(".in","r",stdin);
//	freopen(".out","w",stdout);
	scanf("%d%d",&n,&m);
	for(int i=1;i<=n;i++)scanf("%d",&a[i]);
	for(int i=n-1;i>=1;i--)a[i+1]=a[i+1]-a[i];
	build(1,1,n);
	for(int i=1;i<=m;i++){
		int op,x,y,f,d;
		scanf("%d",&op);
		if(op==1){
			scanf("%d%d%d%d",&x,&y,&f,&d);modify(1,1,n,x,x,f);
			if(x<y)modify(1,1,n,x+1,y,d);
			if(y+1<=n)modify(1,1,n,y+1,y+1,-(f+d*(y-x)));
		}else if(op==2)scanf("%d",&x),printf("%lld\n",query(1,1,n,1,x));
	}
    return 0;
}

顺便放一下#2数据:

paste

2023/4/29 08:09
加载中...