#include <stdio.h>  
#include <algorithm>  
#include <assert.h>
#include <bitset>
#include <cmath>  
#include <complex>  
#include <deque>  
#include <functional>  
#include <iostream>  
#include <limits.h>  
#include <map>  
#include <math.h>  
#include <queue>  
#include <set>  
#include <stdlib.h>  
#include <string.h>  
#include <string>  
#include <time.h>  
#include <unordered_map>  
#include <unordered_set>  
#include <vector>  
#define ll long long
#define rep2(i,a,b) for(ll i=a;i<=b;++i)
#define rep(i,n) for(ll i=0;i<n;i++)
#define rep3(i,a,b) for(ll i=a;i>=b;i--)
#define REP(e,v) for(auto e:v)
#define pii pair<int,int>
#define pll pair<ll,ll>
#define tii tuple<int,int,int>
#define pq priority_queue<int>
#define pqg priority_queue<int,vector<int>,greater<int>>
#define pb push_back
#define edge(v,a,b) v[a].pb(b);v[b].pb(a);
#define MAX_V 400010
#define vec vector<int>
#define vecll vector<ll>
#define vecpii vector<pii>
#define endl "\n"
#define ALL(c) (c).begin(),(c).end()
using namespace std;
int in() {int x;scanf("%d",&x);return x;}
ll lin() {ll x;scanf("%lld",&x);return x;}

#define INF 1e9+7
#define LLINF 1e18+7
ll MOD=1e9+7;
#define N 1055050

ll n,m,k;
ll a[N],b[N];
template< typename Monoid >
struct SegmentTree {
  using F = function< Monoid(Monoid, Monoid) >;
 
  int sz;
  vector< Monoid > seg;
 
  const F f;
  const Monoid M1;
 
  SegmentTree(int n, const F f, const Monoid &M1) : f(f), M1(M1) {
    sz = 1;
    while(sz < n) sz <<= 1;
    seg.assign(2 * sz, M1);
  }
 
  void set(int k, const Monoid &x) {
    seg[k + sz] = x;
  }
 
  void build() {
    for(int k = sz - 1; k > 0; k--) {
      seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);
    }
  }
 
  void update(int k, const Monoid &x) {
    k += sz;
    seg[k] = x;
    while(k >>= 1) {
      seg[k] = f(seg[2 * k + 0], seg[2 * k + 1]);
    }
  }
 
  Monoid query(int a, int b) {
    Monoid L = M1, R = M1;
    for(a += sz, b += sz; a < b; a >>= 1, b >>= 1) {
      if(a & 1) L = f(L, seg[a++]);
      if(b & 1) R = f(seg[--b], R);
    }
    return f(L, R);
  }
 
  Monoid operator[](const int &k) const {
    return seg[k + sz];
  }
};
//SegmentTree(n,f,M1) nで初期化　fは二項演算　M1は単位元
//set(k,x) 要素k = x
//build() 構築
//query 区間[a,b)に二項演算
//update(k,x) kをxに
//operator[k] k番目の要素
// SegmentTree< int > seg(N,[](int a,int b){return min(a,b);},INF);
//みたいに使う
int main(){
    n=in();
    int q=in();
    SegmentTree<ll> seg(n*2+3,[](ll a,ll b){return min(a,b);},LLINF),seg2(n*2+3,[](ll a,ll b){return min(a,b);},LLINF);
    ll sum=0;
    rep(i,n*2){
        a[i]=in();
        sum+=a[i];
    }
    int count=0;
    ll dif=0;
    rep(i,n*2){
        b[i]=in();
        if(i==0||i==n*2-1)continue;
        if(b[i]>a[i]){
            seg.set(i,b[i]-a[i]);
            dif+=b[i]-a[i];
            count++;
        }
        else{
            seg2.set(i,a[i]-b[i]);
        }
    }
    seg.build();seg2.build();
    rep(iii,q){
        int p=in();p--;
        ll prea=a[p],preb=b[p];
        a[p]=in();b[p]=in();
        sum+=a[p]-prea;
        if(p==0||p==n*2-1){
            goto G;
        }
        if(preb>prea){
            count--;
            dif-=preb-prea;
            seg.update(p,LLINF);
        }
        else{
            seg2.update(p,LLINF);
        }
        if(b[p]>a[p]){
            count++;
            seg.update(p,b[p]-a[p]);
            dif+=b[p]-a[p];
        }
        else{
            seg2.update(p,a[p]-b[p]);
        }
        G:
        if(count%2){
            ll ans=sum+dif;
            ans+=max(-seg.query(0,2*n),-seg2.query(0,2*n));
            cout<<ans<<endl;
        }
        else cout<<sum+dif<<endl;
    }
}
/*1 4 7 3
4 6 3 3
*/
