#include<iostream>
#include<cstring>
#include<algorithm>
using namespace std;
const int N = 1e6 + 5;
#define void inline void
#define int long long
#define ls(c) c << 1
#define rs(c) c << 1 | 1
#define For(i, l, r) for (register int i = l; i <= r; i++)
int n,q,s;
template < typename T > void read(T & ff) {
T rr = 1;
ff = 0;
char ch = getchar();
while (!isdigit(ch)) {
if (ch == '-') rr = -1;
ch = getchar();
}
while (isdigit(ch)) {
ff = (ff << 1) + (ff << 3) + (ch ^ 48);
ch = getchar();
}
if(ch==' ') s++;
ff *= rr;
}
struct node {
int l, r, tag, Min;
} t[N * 4];
void down(int c) {
if (t[c].tag) {
t[ls(c)].tag += t[c].tag;
t[rs(c)].tag += t[c].tag;
t[ls(c)].Min += t[c].tag;
t[rs(c)].Min += t[c].tag;
t[c].tag = 0;
}
}
void build(int c, int l, int r) {
t[c].l = l;
t[c].r = r;
if (l == r) {
cin >> t[c].Min;
return;
}
int mid = (l + r) >> 1;
build(ls(c), l, mid);
build(rs(c), mid + 1, r);
t[c].Min = min(t[ls(c)].Min, t[rs(c)].Min);
}
int query(int c, int l, int r) {
if (l <= t[c].l && r >= t[c].r) return t[c].Min;
down(c);
int mid = (t[c].l + t[c].r) >> 1, ans = 1e16;
if (l <= mid) ans = min(ans, query(ls(c), l, r));
if (r > mid) ans = min(ans, query(rs(c), l, r));
return ans;
}
void add(int c, int l, int r, int k) {
if (l <= t[c].l && r >= t[c].r) {
t[c].tag += k;
t[c].Min += k;
return;
}
down(c);
int mid = (t[c].l + t[c].r) >> 1;
if (l <= mid) add(ls(c), l, r, k);
if (r > mid) add(rs(c), l, r, k);
t[c].Min = min(t[ls(c)].Min, t[rs(c)].Min);
return;
}
signed main() {
ios::sync_with_stdio(false);
cin.tie();
cout.tie();
cin >> n;
build(1, 1, n);
cin >> q;
while (q--) {
s=0;
int L,R,K;
read(L);
read(R);
L++;R++;
if(s==2) {
read(K);
if (L <= R) add(1, L, R, K);
else add(1, 1, n, K), add(1, 1, R, K);
} else {
if (L <= R) cout << query(1, L, R) << '\n';
else cout << min(query(1, 1, n), query(1, 1, R)) << '\n';
}
}
return 0;
}