#3 WA On line 6837
其余点 AC
求助qwq
#include<bits/stdc++.h>
using namespace std;
#define ll long long
ll n,m;
const ll N=1000100;
ll a[N];
ll dd[N];
struct Seg{
ll sum;
ll tag;
}st[N*4];
void build(ll root,ll l,ll r){
if(l==r){
st[root].sum=dd[l];
return;
}
ll mid=(l+r)/2;
build(root*2,l,mid);
build(root*2+1,mid+1,r);
st[root].sum=st[root*2].sum+st[root*2+1].sum;
}
void push_down(ll root,ll l,ll r){
if(l==r){
st[root].tag=0;
return;
}
ll mid=(l+r)/2;
st[root*2].sum+=st[root].tag*(mid-l+1);
st[root*2].tag+=st[root].tag;
st[root*2+1].sum+=st[root].tag*(r-mid);
st[root*2+1].tag+=st[root].tag;
st[root].tag=0;
st[root].sum=st[root*2].sum+st[root*2+1].sum;
}
void add(ll root,ll l,ll r,ll x,ll y,ll k){
if(l>=x&&r<=y){
st[root].tag+=k;
st[root].sum+=k*(r-l+1);
return;
}
push_down(root,l,r);
ll mid=(l+r)/2;
if(mid>=x)
add(root*2,l,mid,x,y,k);
if(mid+1<=y)
add(root*2+1,mid+1,r,x,y,k);
st[root].sum=st[root*2].sum+st[root*2+1].sum;
}
ll ask(ll root,ll l,ll r,ll x,ll y){
if(l>=x&&r<=y)
return st[root].sum;
push_down(root,l,r);
ll mid=(l+r)/2;
ll ans=0;
if(mid>=x)
ans+=ask(root*2,l,mid,x,y);
if(mid+1<=y)
ans+=ask(root*2+1,mid+1,r,x,y);
return ans;
}
int main(){
// freopen("无聊的数列.in","r",stdin);
// freopen("无聊的数列.out","w",stdout);
cin>>n>>m;
for(int i=1;i<=n;i++){
scanf("%lld",&a[i]);
dd[i]=a[i]-a[i-1];
}
build(1,1,n);
ll opt,l,r;
ll k,d;
ll p;
for(int i=1;i<=m;i++){
scanf("%lld",&opt);
if(opt==1){
scanf("%lld%lld%lld%lld",&l,&r,&k,&d);
if(l==r){
add(1,1,n,l,l,k);
add(1,1,n,l+1,l+1,-k);
}
else{
add(1,1,n,l,l,k);
add(1,1,n,l+1,r,d);
if(r!=n)
add(1,1,n,r+1,r+1,(ll)(-(k+d*(r-l))));
}
}
if(opt==2){
scanf("%lld",&p);
printf("%lld\n",ask(1,1,n,1,p));
}
}
return 0;
}