维护海拔的差分数组。
h[i]表示海拔的差分数组,dt[i]表示温度的差分数组。
#include<algorithm> #include<cmath> #include<cstdio> #include<cstdlib> #include<cstring> #include<ctime> #include<iomanip> #include<iostream> #include<map> #include<queue> #include<stack> #include<vector> #define rep(i,x,y) for(register int i=(x);i<=(y);i++) #define dwn(i,x,y) for(register int i=(x);i>=(y);i--) #define maxn 200010 #define LL long long #define ls (u<<1) #define rs (u<<1|1) #define mi (l+r>>1) using namespace std; int read() { int x=0,f=1;char ch=getchar(); while(!isdigit(ch)&&ch!='-')ch=getchar(); if(ch=='-')f=-1,ch=getchar(); while(isdigit(ch))x=(x<<1)+(x<<3)+ch-'0',ch=getchar(); return x*f; } void write(LL x) { int f=0;char ch[20]; if(!x){putchar('0'),putchar(' ');return;} if(x<0)x=-x,putchar('-'); while(x)ch[++f]=x%10+'0',x/=10; while(f)putchar(ch[f--]); putchar(' '); } int n,q; LL s,t,h[maxn],dt[maxn],ans; int main() { n=read(),q=read(),s=read(),t=read(); rep(i,0,n)h[i]=read(); dwn(i,n,1)h[i]=h[i-1]-h[i]; rep(i,1,n)dt[i]=h[i]<0?h[i]*s:h[i]*t,ans+=dt[i]; while(q--) { int L=read(),R=read(),X=read(); LL dtL=dt[L],dtR=dt[R+1]; h[L]-=X,h[R+1]+=X; dt[L]=h[L]<0?h[L]*s:h[L]*t; if(R+1<=n)dt[R+1]=h[R+1]<0?h[R+1]*s:h[R+1]*t; ans+=dt[L]+dt[R+1]-dtL-dtR; write(ans); } return 0; }