蒟蒻N开大十倍还RE1~4 没看出来问题
#include<bits/stdc++.h>
using namespace std;
#define LL long long
const int N=1e6;
LL n,m;
LL data[N+10],a[N+10];
void read(LL &a)
{
int x=0,f=1;
char ch=getchar();
while(ch<'0'||ch>'9'){if(ch=='-') f=-1;ch=getchar();}
while(ch>='0'&&ch<='9') {x=x*10+ch-'0';ch=getchar();}
a=x*f;
}
void write(LL x)
{
if(x<0) {putchar('-'),x=-x;}
if(x>9) write(x/10);
putchar(x%10+'0');
}
struct Segment_Tree
{
int l,r;
LL sum,add;
#define l(x) tree[x].l
#define r(x) tree[x].r
#define sum(x) tree[x].sum
#define add(x) tree[x].add
}tree[N*4+10];
void update(LL pos)
{
sum(pos)=sum(pos*2)+sum(pos*2+1);
return;
}
void build(LL pos,LL l,LL r)
{
l(pos)=l;r(pos)=r;
if(l==r) { sum(pos)=a[l];return; }
int mid=( l+r )>>1;
build( pos*2,l,mid);
build( pos*2+1,mid+1,r);
update(pos);
return;
}
void push_down(LL p)
{
if(add(p))
{
sum(p*2) += add(p)*(r(p*2)-l(p*2)+1);
sum(p*2+1) += add(p)*(r(p*2+1)-l(p*2+1)+1);
add(p*2) += add(p);
add(p*2+1) += add(p);
add(p)=0;
}
return;
}
void ChangeAdd(LL p,LL l,LL r,LL d)
{
if(l<=l(p)&&r>=r(p))
{
sum(p)+=(LL)d*(r(p)-l(p)+1);
add(p)+=d;
return;
}
push_down(p);
int mid=(l(p)+r(p))>>1;
if(l<=mid) ChangeAdd(p*2,l,r,d);
if(r>mid) ChangeAdd(p*2+1,l,r,d);
update(p);
}
LL query(LL p,LL l,LL r)
{
if(l<=l(p)&&r>=r(p)) return sum(p);// be totally covered
push_down(p);
int mid=(l(p)+r(p))>>1;
LL val=0;
if(l<=mid) val+=query(p*2,l,r);// left_child.search
if(r>mid) val+=query(p*2+1,l,r);// right_child.search
return val;
}
int main()
{
cin>>n>>m;
for(int i=1;i<=n;i++) read(data[i]);
for(int i=1;i<=n;i++) a[i]=data[i]-data[i-1];
build(1,1,n);
for(int i=1;i<=m;i++)
{
LL opt;
read(opt);
if(opt==1)
{
LL l,r,K,D;
read(l);read(r);read(K);read(D);
ChangeAdd(1,l,l,K);
ChangeAdd(1,l+1,r,D);
ChangeAdd(1,r+1,r+1,-(K+D*(r-l)));
}
else
{
LL n;
read(n);
write(query(1,1,n));
printf("\n");
}
}
}