二阶差分O(1),暴力找前缀O(n)
代码:
#include <bits/stdc++.h>
#define L long long
#define F(a,b) for(a=1;a<=b;a++)
using namespace std;
L a[1<<20],s[1<<20],n,q,l,r,K,D;
void qj(L l,L r,L w){
s[l]+=w,s[r+1]-=w;
}
int main(){
cin>>n>>q;
F(K,n) cin>>a[K];
F(n,q){
cin>>l;
if(l==1){
cin>>l>>r>>K>>D;
qj(l,l,K);qj(l+1,r,D);qj(r+1,r+1,(l-r)*D-K);
}
else{
D=0;
cin>>l;
F(r,l)
D+=s[r]*(l-r+1);
cout<<D+a[l]<<'\n';
}
}
}
随便卡,make data:
cout<<"100000 100000\n"
for(int i=1;i<=100000;i++){
cout<<2<<' '<<n;
}
不加强,搞个极端的 hack 也行