DO
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
const int INF = 1e9;
int mxN = 1;
vector <int> tree;
vector <int> sset;
void push(int v)
{
if (v >= mxN)
{
return;
}
if (sset[v] != INF)
{
tree[v * 2] = tree[v * 2 + 1] = sset[v * 2] = sset[v * 2 + 1] = sset[v];
sset[v] = INF;
}
}
void build(vector <int> a)
{
int n = a.size();
while (mxN < n)
{
mxN <<= 1;
}
tree.assign(mxN << 1, INF);
sset.assign(mxn << 1, INF);
for (int i = 0; i < n; i++){
tree[i + mxN] = a[i];
}
for (int i = mxN - 1; i > 0; i--)
{
tree[i] = min(tree[i * 2], tree[i * 2 + 1]);
}
}
int getMin(int v, int tl, int tr, int l, int r)
{
push(v);
if (tl > r || l > tr)
{
return INF;
}
if (l <= tl && tr <= r)
{
return tree[v];
}
int tm = (tl + tr) / 2;
return min(getMin(v * 2, tl, tm, l, r), getMin(v * 2 + 1, tm + 1, tr, l, r));
}
void setVal(int v, int tl, int tr, int x, int val)
{
push(v);
if (tl > x || x > tr)
{
return;
}
if (tl == tr)
{
tree[v] = val;
return;
}
int tm = (tl + tr) / 2;
setVal(v * 2, tl, tm, x, val);
setVal(v * 2 + 1, tm + 1, tr, x, val);
tree[v] = min(tree[v * 2], tree[v * 2 + 1]);
return;
}
void addVal(int v, int tl, int tr, int x, int val)
{
push(v);
if (tl > x || x > tr)
{
return;
}
if (tl == tr)
{
tree[v] += val;
return;
}
int tm = (tl + tr) / 2;
addVal(v * 2, tl, tm, x, val);
addVal(v * 2 + 1, tm + 1, tr, x, val);
tree[v] = min(tree[v * 2], tree[v * 2 + 1]);
return;
}
void setValSeg(int v, int tl, int tr, int l, int r, int val)
{
push(v);
if (tl > r || l > tr) return;
if (l <= tl && tr <= r)
{
sset[v] = tree[v] = val;
return;
}
int tm = (tl + tr) / 2;
setValSeg(v * 2, tl, tm, l, r, val);
setValSeg(v * 2 + 1, tm + 1, tr, l, r, val);
tree[v] = min(tree[v * 2], tree[v * 2 + 1]);
return;
}
int main()
{
int n, q;
cin >> n >> q;
vector <int> a(n);
for (int i = 0; i < n; i++)
{
cin >> a[i];
}
build(a);
for (int i = 0; i < q; i++)
{
char z;
cin >> z;
if (z == '?')
{
int l, r;
cin >> l >> r; l--, r--;
cout << getMin(1, 0, mxN - 1, l, r) << endl;
}
else if (z == '+')
{
int x, val;
cin >> x >> val; x--;
addVal(1, 0, mxN - 1, x, val);
}
else
{
int x, val;
cin >> x >> val; x--;
setVal(1, 0, mxN - 1, x, val);
}
}
return 0;
}