#include <bits/stdc++.h>
using namespace std;
struct Segtree {
  int N;
  vector<long long> ST, L;
  Segtree(vector<int> &A) {
    N = A.size();
    ST.resize(4 * N);
    L.resize(4 * N);
    build(1, 0, N - 1, A);
  }
  void build(long long node, long long l, long long r, vector<int> &A) {
    if (l == r) {
      ST[node] = A[r];
      return;
    }
    build(2 * node, l, (l + r) / 2, A);
    build(2 * node + 1, ((l + r) / 2) + 1, r, A);
    ST[node] = min(ST[2 * node], ST[2 * node + 1]);
    return;
  }
  long long query(long long i, long long j) { return query(1, 0, N - 1, i, j); }
  long long query(long long node, long long l, long long r, long long &i,
                  long long &j) {
    if (L[node] != 0) {
      ST[node] += L[node];
      if (l != r) {
        L[2 * node] += L[node];
        L[2 * node + 1] += L[node];
      }
      L[node] = 0;
    }
    if (i <= l && r <= j) return ST[node];
    if (j < l || r < i) return INT_MAX;
    return min(query(2 * node, l, (l + r) / 2, i, j),
               query(2 * node + 1, (l + r) / 2 + 1, r, i, j));
  }
  void update(long long i, long long j, long long x) {
    uptade(1, 0, N - 1, i, j, x);
  }
  void uptade(long long node, long long l, long long r, long long &i,
              long long &j, long long &x) {
    if (L[node] != 0) {
      ST[node] += L[node];
      if (l != r) {
        L[2 * node] += L[node];
        L[2 * node + 1] += L[node];
      }
      L[node] = 0;
    }
    if (i <= l && r <= j) {
      ST[node] += x;
      if (l != r) {
        L[2 * node] += x;
        L[2 * node + 1] += x;
      }
      return;
    }
    if (j < l || r < i) return;
    uptade(2 * node, l, (l + r) / 2, i, j, x);
    uptade(2 * node + 1, (l + r) / 2 + 1, r, i, j, x);
    ST[node] = min(ST[2 * node], ST[2 * node + 1]);
  }
};
int main() {
  int n, m;
  cin >> n;
  vector<int> A(n);
  for (int i = 0; i < n; i++) {
    cin >> A[i];
  }
  Segtree ST(A);
  cin >> m;
  int lf, rg, v;
  for (int i = 0; i < m; i++) {
    char d;
    cin >> lf >> rg;
    cin.get(d);
    if (d == ' ') {
      cin >> v;
      if (lf > rg) {
        ST.update(lf, (A.size() - 1), v);
        ST.update(0, rg, v);
      } else {
        ST.update(lf, rg, v);
      }
    } else {
      if (lf > rg) {
        cout << min(ST.query(lf, A.size() - 1), ST.query(0, rg)) << endl;
      } else {
        cout << ST.query(lf, rg) << endl;
      }
    }
  }
}
