#include <stdio.h>
#include <limits.h>
#include <math.h>

int n;
int mins[200000];

void update(int arrIndex, int val) {
  //printf("updating node %d\n", arrIndex);
  mins[arrIndex] = val;

  if (arrIndex <= 1)
    return;
  
  if (mins[arrIndex / 2] > val)
    update(arrIndex / 2, val);
}

int find(int node, int l, int r, int i, int j) {
  if (r < i || l > j)
    return INT_MAX;
  else if (l >= i && r <= j)
    return mins[node];
  else {
    int lValue = find(2*node, l, (l + r) / 2, i, j);
    int rValue = find((2*node)+1, (l + r) / 2 + 1, r, i, j);

    return lValue < rValue ? lValue : rValue;
  }
}

int main() {
  int q, i, j, query, counter, cur, powerOf2[18], lengthOfBottomRow;

  scanf("%d %d", &n, &q);
  
  for (i = 0; i < 18; i++) {
    cur = 2;

    for (j = 0; j < i; j++)
      cur *= 2;

    powerOf2[i] = cur;

    if (i) {
      if (powerOf2[i-1] < 2 * n && powerOf2[i] > 2 * n)
	lengthOfBottomRow = powerOf2[i];
    }
  }

  //printf("length of bottom row: %d\n", lengthOfBottomRow);

  for (counter = 1; counter < lengthOfBottomRow; counter++)
    mins[counter] = INT_MAX;

  //printf("initialized min array\n");
  // mins[0] is not used, 1-n is tree nodes, n+1-2n is leaves, everything after
  // 2n isn't used

  for (counter = 0; counter < q; counter++) {
    scanf("%d %d %d", &query, &i, &j);

    if (query)
      printf("%d\n", find(1, lengthOfBottomRow / 2, lengthOfBottomRow - 1, i + n + 1, j + n + 1));
    else
      update(i + 1 + n, j);
  }
}

