#include <bits/stdc++.h>
using LL = long long;
using PII = std::pair<int, int>;
struct Info {
LL minv;
Info(LL minv = 1E9) : minv(minv) {}
};
Info operator+(const Info& a, const Info& b) {
return std::min(a.minv, b.minv);
}
struct Tag {
LL add;
Tag(LL add = 0) : add(add) {}
};
void apply(Info& a, Tag b) {
a.minv += b.add;
}
void apply(Tag& a, Tag b) {
a.add += b.add;
}
template <typename Info, typename Tag,
typename Merge = std::plus<Info>>
struct LazySegmentTree {
const int n;
const Merge merge;
std::vector<Info> info;
std::vector<Tag> tag;
LazySegmentTree(int n) : n(n), merge(Merge()),
info(4 << std::__lg(n)), tag(4 << std::__lg(n)) { }
LazySegmentTree(std::vector<Info> init) : LazySegmentTree(init.size() - 1) {
std::function<void(int, int, int)> build = [&](int p, int l, int r) {
if(r == l) {
info[p] = init[l];
return;
}
int mid = (l + r) >> 1;
build(2 * p, l, mid);
build(2 * p + 1, mid + 1, r);
pull(p);
};
build(1, 1, n);
}
void pull(int p) {
info[p] = merge(info[2 * p], info[2 * p + 1]);
}
void apply(int p, const Tag &v) {
::apply(info[p], v);
::apply(tag[p], v);
}
void push(int p) {
apply(2 * p, tag[p]);
apply(2 * p + 1, tag[p]);
tag[p] = Tag();
}
void modify(int p, int l, int r, int x, const Info &v) {
if(r == l) {
info[p] = v;
return;
}
int mid = (l + r) >> 1;
push(p);
if(x <= mid) {
modify(p * 2, l, mid, x, v);
}
else {
modify(p * 2 + 1, mid + 1, r, x, v);
}
pull(p);
}
void modify(int p, const Info& v) {
modify(1, 1, n, p, v);
}
Info rangeQuery(int p, int l, int r, int x, int y) {
if (l > y || r < x) return Info();
if (l >= x && r <= y) return info[p];
int mid = (l + r) >> 1;
push(p);
return merge(rangeQuery(p * 2, l, mid, x, y), rangeQuery(p * 2 + 1, mid + 1, r, x, y));
}
Info rangeQuery(int l, int r) {
return rangeQuery(1, 1, n, l, r);
}
void rangeApply(int p, int l, int r, int x, int y, const Tag &v) {
if (l > y || r < x) {
return;
}
if (l >= x && r <= y) {
apply(p, v);
return;
}
int mid = (l + r) >> 1;
push(p);
rangeApply(2 * p, l, mid, x, y, v);
rangeApply(2 * p + 1, mid + 1, r, x, y, v);
pull(p);
}
void rangeApply(int l, int r, const Tag &v) {
return rangeApply(1, 1, n, l, r, v);
}
};
int main() {
std::ios::sync_with_stdio(false);
std::cin.tie(nullptr);
int n;
std::cin >> n;
std::vector<Info> a(n + 1);
for (int i = 1; i <= n; i ++ ) {
std::cin >> a[i].minv;
}
LazySegmentTree<Info, Tag> seg(a);
int m;
std::cin >> m;
std::string s;
std::getline(std::cin, s);
// std::cout << seg.rangeQuery(1, 4).minv << "\n";
while (m--) {
std::getline(std::cin, s);
std::stringstream ssin(s);
std::vector<int> v;
int x;
while (ssin >> x) {
v.push_back(x);
}
if (v.size() == 2) {
int l = v[0], r = v[1];
l++, r++;
// std::cout << l << " " << r << "\n";
if (l <= r)
std::cout << seg.rangeQuery(l, r).minv << "\n";
else
std::cout << std::min(seg.rangeQuery(1, r).minv, seg.rangeQuery(l, n).minv) << "\n";
} else {
int l = v[0], r = v[1], val = v[2];
l++, r++;
if (l <= r)
seg.rangeApply(l, r, val);
else {
seg.rangeApply(1, r, val);
seg.rangeApply(l, n, val);
}
}
}
return 0;
}