sumA=∑ni=1(−1)i−1ai
sumB[j]=∑ni=1(−1)ibi+j
显然
f(j)=|sumA+sumB[j]|
对每次更新
[l,r,x]
显然只有(r−l+1)%2==1时,sumA才会改变
当l%2==1,sumA+=x
否则sumA−=x
而
sumB[j]=−(sumB[j−1]+bj)+bn+j∗(n%2==1?−1:1)
所以sumB可以在O(m)处理出来
sumA每次update可以O(1)处理
二分找最接近sumA的sumB即可得到答案
#include<stdio.h>
#include<bits/stdc++.h>
#define ll long long
#define pii pair<int,int>
#define pll pair<ll,ll>
#define MEM(a,x) memset(a,x,sizeof(a))
#define lowbit(x) ((x)&-(x))
using namespace std;
const int INF = 1e9+7;
const int inf=INF;
const int N = 1e5+50;
ll sumA;
int b[N];
ll sumB[N];
void getSumB(int m,int n){
sumB[0]=0;
for(int i=1,flag=-1;i<=m;++i,flag*=-1){
scanf("%d",&b[i]);
if(i<=n){
sumB[0]+=b[i]*flag;
}
}
for(int i=1;n+i<=m;++i){
sumB[i]=-(sumB[i-1]+b[i])+b[n+i]*((n&1)?-1:1);
}
}
void getSumA(int n){
sumA=0;
for(int i=1,flag=1;i<=n;++i,flag*=-1){
int x;
scanf("%d",&x);
sumA+=flag*x;
}
}
void add(int l,int r,int x){
if((r-l)%2==0){
if(l%2==1){
sumA+=x;
}
else{
sumA-=x;
}
}
}
ll __abs(ll x){
return x>0?x:-x;
}
ll query(int l,int r,int x,int bSz){
add(l,r,x);
ll*it=lower_bound(sumB,sumB+bSz,-sumA);
ll ans=1e18+5;
if(it!=sumB+bSz){
ans=min(ans,__abs(sumA+*it));
}
if(it!=sumB){
--it;
ans=min(ans,__abs(sumA+*it));
}
//add(l,r,-x);
return ans;
}
int main(){
//freopen("/home/lu/code/r.txt","r",stdin);
//freopen("/home/lu/code/w.txt","w",stdout);
int n,m,q;
while(~scanf("%d%d%d",&n,&m,&q)){
getSumA(n);
getSumB(m,n);
int bSz=m-n+1;
sort(sumB,sumB+bSz);
printf("%lld\n",query(1,1,0,bSz));
while(q--){
int l,r,x;
scanf("%d%d%d",&l,&r,&x);
printf("%lld\n",query(l,r,x,bSz));
}
}
return 0;
}