#include <bits/stdc++.h>
using namespace std;
int a[200005];
long long tr[800005], tag[800005];
void build(int l, int r, int p) {
  if (l == r) {
    tr[p] = a[l];
    return;
  }
  int mid = l + r >> 1;
  build(l, mid, p << 1);
  build(mid + 1, r, p << 1 | 1);
  tr[p] = min(tr[p << 1], tr[p << 1 | 1]);
}
void push_down(int l, int r, int p) {
  tag[p << 1] += tag[p];
  tag[p << 1 | 1] += tag[p];
  int mid = l + r >> 1;
  tr[p << 1] += tag[p];
  tr[p << 1 | 1] += tag[p];
  tag[p] = 0;
}
void update(int l, int r, int x, int y, int z, int p) {
  if (l == x && r == y) {
    tag[p] += z;
    tr[p] += z;
    return;
  }
  if (tag[p]) push_down(l, r, p);
  int mid = l + r >> 1;
  if (y <= mid)
    update(l, mid, x, y, z, p << 1);
  else if (x > mid)
    update(mid + 1, r, x, y, z, p << 1 | 1);
  else {
    update(l, mid, x, mid, z, p << 1);
    update(mid + 1, r, mid + 1, y, z, p << 1 | 1);
  }
  tr[p] = min(tr[p << 1], tr[p << 1 | 1]);
}
long long query(int l, int r, int x, int y, int p) {
  if (l == x && r == y) return tr[p];
  if (tag[p]) push_down(l, r, p);
  int mid = l + r >> 1;
  if (y <= mid)
    return query(l, mid, x, y, p << 1);
  else if (x > mid)
    return query(mid + 1, r, x, y, p << 1 | 1);
  else
    return min(query(l, mid, x, mid, p << 1),
               query(mid + 1, r, mid + 1, y, p << 1 | 1));
}
int main() {
  int n;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) scanf("%d", &a[i]);
  build(1, n, 1);
  int q;
  scanf("%d\n", &q);
  while (q--) {
    string s;
    getline(cin, s);
    int len = s.length();
    int t[5] = {}, tot = 1, fu = 1;
    for (int i = 0; i < len; i++)
      if (s[i] == ' ') {
        t[tot++] *= fu;
        fu = 1;
      } else if (s[i] == '-')
        fu = -1;
      else
        t[tot] = t[tot] * 10 + s[i] - '0';
    t[tot] *= fu;
    t[1]++, t[2]++;
    if (tot == 2)
      printf("%lld\n", t[1] <= t[2] ? query(1, n, t[1], t[2], 1)
                                    : min(query(1, n, 1, t[2], 1),
                                          query(1, n, t[1], n, 1)));
    else if (t[1] <= t[2])
      update(1, n, t[1], t[2], t[3], 1);
    else {
      update(1, n, 1, t[2], t[3], 1);
      update(1, n, t[1], n, t[3], 1);
    }
  }
  return 0;
}
