DO

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;

}

Report Page