先端数求祝!阳历书橱乐市二!
#include<bits/stdc++.h>
using namespace std;
#define maxn 100001
typedef long long ll;
ll x[maxn*4],y[maxn*4],w[maxn*4];
int n,m,opt,a[10682];
inline void push_up(int u){w[u]=w[u<<1]+w[u<<1|1];}
inline bool in_range(int L,int R,int l,int r){return (R<=r)&&(L>=l);}
inline bool outof_range(int L,int R,int l,int r){return (L>r)||(R<l);}
inline void build(int u,int L,int R)
{
int mid=(L+R)>>1;
if(L==R)
{
w[u]=a[L];
return;
}
build(u<<1,L,mid);
build(u<<1|1,mid+1,R);
push_up(u);
}
inline ll Sum(int ax,int ay,int len)
{
int an=ax+ay*(len-1ll);
return 1ll*(ax+an)*len/2;
}
inline void maketag(int u,int l,int r,int ax,int ay)
{
x[u]+=ax; y[u]+=ay; //懒标记
w[u]+=Sum(ax,ay,r-l+1);
}
inline void pushdown(int u,int L,int R)
{
int mid=(L+R)>>1;
maketag(u<<1,L,mid,x[u],y[u]);
maketag(u<<1|1,mid+1,R,x[u],y[u]);
x[u]=0,y[u]=0;
}
inline ll query(int u,int L,int R,int l,int r)
{
if(in_range(L,R,l,r)) return w[u];
else if(!outof_range(L,R,l,r))
{
int mid=(L+R)>>1;
pushdown(u,L,R);
return query(u<<1,L,mid,l,r)+query(u<<1|1,mid+1,R,l,r);
}
else return 0;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=n-1;i>0;i--) a[i+1]=a[i+1]-a[i];
build(1,1,n);
for(int i=1;i<=m;i++)
{
cin>>opt;
if(opt==1)
{
int l,r,k,d;
cin>>l>>r>>k>>d;
maketag(1,l,r,k,d);
}
else
{
int p;
cin>>p;
cout<<query(1,1,n,1,p)<<endl;
}
}
return 0;
}
唔唔唔……睡螚邦邦吾?