#include <bits/stdc++.h>
using namespace std;
const int MAX_N = 100000;
const long long INFLL = 1e15;
int N, Q;
long long a[MAX_N + 1], b[MAX_N + 1];
long long S = 0;
long long zero(long long x) { return (x > 0) ? x : -x; }
struct SEG1 {
  struct NODE {
    int l, r;
    bool b;
  };
  vector<NODE> seg;
  int SZ;
  void add() { seg.push_back({-1, -1, false}); }
  void Init(int x) {
    SZ = x;
    add();
    init(0, 1, SZ);
  }
  void init(int idx, int s, int e) {
    if (s == e) return;
    seg[idx].l = seg.size();
    add();
    seg[idx].r = seg.size();
    add();
    init(seg[idx].l, s, (s + e) / 2);
    init(seg[idx].r, (s + e) / 2 + 1, e);
  }
  void Update(int x, bool y) { update(0, 1, SZ, x, y); }
  void update(int idx, int s, int e, int x, bool y) {
    if (s == e) {
      seg[idx].b = y;
      return;
    }
    if (x <= (s + e) / 2) {
      update(seg[idx].l, s, (s + e) / 2, x, y);
    } else {
      update(seg[idx].r, (s + e) / 2 + 1, e, x, y);
    }
    seg[idx].b = (seg[seg[idx].l].b | seg[seg[idx].r].b);
  }
  bool Ret(int x, int y) { return ret(0, 1, SZ, x, y); }
  bool ret(int idx, int s, int e, int x, int y) {
    if (x <= s && e <= y) {
      return seg[idx].b;
    }
    if (x > e || y < s) return false;
    return (ret(seg[idx].l, s, (s + e) / 2, x, y) |
            ret(seg[idx].r, (s + e) / 2 + 1, e, x, y));
  }
} Seg1;
struct SEG2 {
  struct NODE {
    int l, r;
    long long mn;
  };
  int SZ;
  vector<NODE> seg;
  void add() { seg.push_back({-1, -1, INFLL}); }
  void Init(int x) {
    SZ = x;
    add();
    init(0, 1, SZ);
  }
  void init(int idx, int s, int e) {
    if (s == e) return;
    seg[idx].l = seg.size();
    add();
    seg[idx].r = seg.size();
    add();
    init(seg[idx].l, s, (s + e) / 2);
    init(seg[idx].r, (s + e) / 2 + 1, e);
  }
  void Update(int x, long long y) { update(0, 1, SZ, x, y); }
  void update(int idx, int s, int e, int x, long long y) {
    if (s == e) {
      seg[idx].mn = y;
      return;
    }
    if (x <= (s + e) / 2) {
      update(seg[idx].l, s, (s + e) / 2, x, y);
    } else {
      update(seg[idx].r, (s + e) / 2 + 1, e, x, y);
    }
    seg[idx].mn = min(seg[seg[idx].l].mn, seg[seg[idx].r].mn);
  }
  long long Mn(int x, int y) { return mn(0, 1, SZ, x, y); }
  long long mn(int idx, int s, int e, int x, int y) {
    if (x <= s && e <= y) return seg[idx].mn;
    if (x > e || y < s) return INFLL;
    return min(mn(seg[idx].l, s, (s + e) / 2, x, y),
               mn(seg[idx].r, (s + e) / 2 + 1, e, x, y));
  }
} Seg2;
void make(int x) {
  if (b[x - 1] >= 0 && b[x] <= 0) {
    Seg2.Update(x, INFLL);
    Seg1.Update(x, true);
    return;
  }
  Seg1.Update(x, false);
  if (b[x - 1] < 0 && b[x] > 0) {
    Seg2.Update(x, 2LL * b[x] - 2LL * b[x - 1]);
    return;
  }
  if (b[x - 1] >= 0) {
    Seg2.Update(x, 2LL * b[x]);
  } else {
    Seg2.Update(x, -2LL * b[x - 1]);
  }
}
int main() {
  scanf("%d", &N);
  Seg1.Init(N);
  Seg2.Init(N);
  for (int i = 1; i <= N; i++) {
    scanf("%lld", &a[i]);
    if (i >= 2) {
      b[i - 1] = a[i] - a[i - 1];
      S += zero(b[i - 1]);
    }
  }
  for (int i = 2; i < N; i++) {
    make(i);
  }
  scanf("%d", &Q);
  for (int i = 1; i <= Q; i++) {
    int t, l, r;
    long long x;
    scanf("%d%d%d%lld", &t, &l, &r, &x);
    if (t == 1) {
      if (l == r) {
        if (l == 1) {
          printf("%lld\n", S - zero(b[1]) + zero(b[1] - x));
        } else if (l == N) {
          printf("%lld\n", S - zero(b[N - 1]) + zero(b[N - 1] + x));
        } else {
          printf("%lld\n", S - zero(b[l]) - zero(b[l - 1]) + zero(b[l] - x) +
                               zero(b[l - 1] + x));
        }
      } else if (Seg1.Ret(l, r)) {
        printf("%lld\n", S + x * 2LL);
      } else {
        long long mx = 0LL;
        long long t = Seg2.Mn(l, r);
        mx = max(mx, 2LL * x - t);
        if (l == 1) {
          mx = max(mx, zero(b[1] - x) - zero(b[1]));
        }
        if (r == N) {
          mx = max(mx, zero(x + b[N - 1]) - zero(b[N - 1]));
        }
        printf("%lld\n", S + mx);
      }
    } else {
      if (l != 1) {
        S -= zero(b[l - 1]);
        b[l - 1] += x;
        S += zero(b[l - 1]);
        make(l);
        if (l != 2) make(l - 1);
      }
      if (r != N) {
        S -= zero(b[r]);
        b[r] -= x;
        S += zero(b[r]);
        make(r);
        if (r != N - 1) make(r + 1);
      }
    }
  }
}
