#includeusing namespace std;inline int read() { int x = 0,ff = 1; char ch = getchar(); while(!isdigit(ch)) { if(ch == '-') ff = -1; ch = getchar(); } while(isdigit(ch)) { x = (x << 1) + (x << 3) + (ch ^ 48); ch = getchar(); } return x * ff;}inline void write(int x) { if(x < 0) putchar('-'),x = -x; if(x > 9) write(x / 10); putchar(x % 10 + '0');}const int INF = 0x3f3f3f3f;const int MAXN = 5e5 + 100;const int MAXM = 3e3 + 10;int n,a[MAXN];struct Tree { int left,right; int dat;}t[MAXN];void build(int p,int l,int r) { t[p].left = l; t[p].right = r; if(l == r) { t[p].dat = a[l]; return ; } int mid = (l + r) / 2; build(p * 2,l,mid); build(p * 2 + 1,mid + 1,r); t[p].dat = max(t[p * 2].dat,t[p * 2 + 1].dat);}void change(int p,int x,int v) { if(t[p].left == t[p].right) { t[p].dat = v; return ; } int mid = (t[p].left + t[p].right) / 2; if(x <= mid) change(p * 2,x,v); else change(p * 2 + 1,x,v); t[p].dat = max(t[p * 2].dat,t[p * 2 + 1].dat);}int ask(int p,int l,int r) { if(l <= t[p].left && r >= t[p].right) return t[p].dat; int mid = (t[p].left + t[p].right) / 2; int val = -INF; if(l <= mid) val = max(val,ask(p * 2,l,r)); if(r > mid) val = max(val,ask(p * 2 + 1,l,r)); return val;}int main() { n = read(); build(1,1,n); for(int i = 1; i <= n; ++i) { int op; op = read(); if(op == 1) { int x,v; x = read(); v = read(); change(1,x,v); } else { int l,r; l = read(); r = read(); write(ask(1,l,r)); putchar('\n'); } } return 0;}