只过#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数据: