题解 CF1406D 【Three Sequences】
非常好的一道性质题。
手玩+稍加证明就可以发现,
由于
发现
加上修改操作又该怎么做呢?我们发现一次修改事实上只会影响
#include<cstdio>
#include<cmath>
typedef long long ll;
int n,a[100005];;
ll sum[100005],d[100005];
inline int read() {
register int x=0,f=1;register char s=getchar();
while(s>'9'||s<'0') {if(s=='-') f=-1;s=getchar();}
while(s>='0'&&s<='9') {x=x*10+s-'0';s=getchar();}
return x*f;
}
inline void add(int x,int val) {for(;x<=n;x+=x&(-x)) sum[x]+=val;}
inline ll ask(int x) {ll res=0; for(;x;x-=x&(-x)) res+=sum[x]; return res;}
int main() {
n=read(); ll cur=0;
for(register int i=1;i<=n;++i) a[i]=read();
for(register int i=2;i<=n;++i) d[i]=(a[i]-a[i-1])*(a[i]>=a[i-1]);
for(register int i=2;i<=n;++i) cur+=d[i];
printf("%lld\n",(ll)ceil((a[1]+cur)*1.00/2));
int T=read();
while(T--) {
int l=read(),r=read(),x=read();
add(l,x);if(r<n) add(r+1,-x);
ll a1=a[l-1]+ask(l-1),a2=a[l]+ask(l);
if(l>1) {cur-=d[l];d[l]=(a2-a1)*(a2>=a1);cur+=d[l];}
a1=a[r]+ask(r),a2=a[r+1]+ask(r+1);
if(r<n) {cur-=d[r+1];d[r+1]=(a2-a1)*(a2>=a1);cur+=d[r+1];}
printf("%lld\n",(ll)ceil((a[1]+ask(1)+cur)*1.00/2));
}
return 0;
}