#include <bits/stdc++.h>
using namespace std;
long long n;
long long num[65536 * 4];
struct segmenttree {
  long long tree[65536 * 4 * 2 + 10];
  void clear() { memset(tree, 0x3f, sizeof(tree)); }
  void update(long long x, long long y) {
    x = x + 65536 * 4 - 1;
    tree[x] = y;
    x = x / 2;
    while (x) tree[x] = min(tree[x * 2], tree[x * 2 + 1]), x = x / 2;
  }
  long long query(long long a, long long b, long long l, long long r,
                  long long id) {
    if (a > b) return 0;
    if (l >= a and r <= b) return tree[id];
    long long mid = (l + r) / 2;
    if (a <= mid and b <= mid) return query(a, b, l, mid, id * 2);
    if (a > mid and b > mid) return query(a, b, mid + 1, r, id * 2 + 1);
    return min(query(a, b, l, mid, id * 2),
               query(a, b, mid + 1, r, id * 2 + 1));
  }
} seg;
struct sumtree {
  long long tree[65536 * 4 * 2 + 10];
  long long tag[65536 * 4 * 2 + 10];
  void down(long long id) {
    tree[id * 2] += tag[id], tree[id * 2 + 1] += tag[id],
        tag[id * 2] += tag[id], tag[id * 2 + 1] += tag[id];
    tag[id] = 0;
  }
  void update(long long a, long long b, long long l, long long r, long long id,
              long long y) {
    if (l >= a and r <= b) {
      tree[id] += y, tag[id] += y;
      return;
    }
    down(id);
    long long mid = (l + r) / 2;
    if (a <= mid) update(a, b, l, mid, id * 2, y);
    if (b > mid) update(a, b, mid + 1, r, id * 2 + 1, y);
  }
  long long query(long long x, long long l, long long r, long long id) {
    if (l == r) return tree[id];
    down(id);
    long long mid = (l + r) / 2;
    if (x <= mid) return query(x, l, mid, id * 2);
    return query(x, mid + 1, r, id * 2 + 1);
  }
} val;
long long a[65536 * 4];
long long tots;
void real(long long x) {
  if (x <= 0 or x > n) return;
  a[x] = val.query(x, 1, 65536 * 4, 1);
}
void upd(long long i) {
  real(i);
  real(i - 1);
  real(i + 1);
  seg.update(i, max(-a[i] + a[i - 1], 0ll) + max(-a[i] + a[i + 1], 0ll));
}
int main() {
  cin >> n;
  for (long long i = 1; i <= n; i++) scanf("%lld", &a[i]);
  a[0] = a[1], a[n + 1] = a[n];
  seg.clear();
  for (long long i = 1; i <= n; i++) {
    tots += abs(a[i] - a[i + 1]);
    val.update(i, i, 1, 65536 * 4, 1, a[i]);
  }
  for (int i = 1; i <= n; i++) upd(i);
  long long Q;
  cin >> Q;
  while (Q--) {
    long long t, l, r, x;
    scanf("%lld%lld%lld%lld", &t, &l, &r, &x);
    if (t == 1) {
      if (l == r) {
        real(l);
        real(l - 1);
        real(l + 1);
        printf("%lld\n", tots - abs(a[l] - a[l - 1]) - abs(a[l] - a[l + 1]) +
                             abs(a[l] - a[l - 1] + x) +
                             abs(a[l] - a[l + 1] + x));
        continue;
      }
      long long ct = seg.query(l, r, 1, 65536 * 4, 1);
      if (ct - x > 0) ct = x;
      printf("%lld\n", tots + x * 2 - 2 * max(ct, 0ll));
    } else {
      if (l == 1) a[0] += x;
      if (r == n) a[n + 1] += x;
      real(l), real(l - 1), real(r), real(r + 1);
      tots = tots - abs(a[l] - a[l - 1]) + abs(a[l] - a[l - 1] + x);
      tots = tots - abs(a[r] - a[r + 1]) + abs(a[r] - a[r + 1] + x);
      val.update(l, r, 1, 65536 * 4, 1, x);
      upd(l);
      upd(r);
      upd(l - 1);
      upd(r + 1);
    }
  }
  return 0;
}
