0分,大佬调调
查看原帖
0分,大佬调调
1359039
SByubozhao楼主2025/6/12 16:57
#include<bits/stdc++.h>
using namespace std;
long long n,m,a[100005],tree[800005],tree1[800005],tree2[800005];
void build(int id,int l,int r){
	tree1[id]=0;
	tree2[id]=0;
	if(l==r){
		tree[id]=a[l];
		return ;
	}
	int mid=(l+r)/2;
	build(id<<1,l,mid);
	build(id<<1|1,mid+1,r);
	return ; 
}
void push_dow(int id,int l,int r,int mid){
    tree1[id<<1]+=tree1[id];
    tree2[id<<1]+=tree2[id];
    tree1[id<<1|1]+=tree1[id]+(mid-l+1)*tree2[id];
    tree2[id<<1|1]+=tree2[id];
    tree1[id]=0;
    tree2[id]=0;
    return ;
}
void mdy(int id,int l,int r,int x,int y,int k,int d){
	if(x>r||y<l)
		return ; 
	if(l>=x&&r<=y){
		tree1[id]+=k;
		tree2[id]+=d;
        int mx=(r-l)*tree2[id]+tree1[id];
		tree[id]+=(tree1[id]+mx)*(r-l+1)/2;
		return ;
	}
	int mid=(l+r)/2;
    push_dow(id,l,r,mid);
	mdy(id<<1,l,mid,x,y,k,d);
    if(mid-x==0)
        mdy(id<<1|1,mid+1,r,x,y,k,d);
    else 
    	mdy(id<<1|1,mid+1,r,x,y,k+(mid-x+1)*d,d);
	return ;
}
long long qry(int id,int l,int r,int x){
	if(x>r||x<l)
		return -1e8;
	if(l==r&&l==x)
		return tree[id];
	int mid=(l+r)/2;
	push_dow(id,l,r,mid);
	return max(qry(id<<1,l,mid,x),qry(id<<1|1,mid+1,r,x));
}
int main(){
	cin>>n>>m; 
	for(int i=1;i<=n;i++)
		cin>>a[i];
	build(1,1,n);
	while(m--){
		int x,y,k,d,op;
		cin>>op;
		if(op==1){
			cin>>x>>y>>k>>d;
			mdy(1,1,n,x,y,k,d);
		}
		else{
			cin>>x;
			cout<<qry(1,1,n,x)<<'\n';
		}
	}
	return 0;
 } 
2025/6/12 16:57
加载中...