#include <bits/stdc++.h>   using namespace std;   struct SegmentTree {     int l, r, val, lazy;   } t[800005];   int n, q, a[200005];   void build(int l, int r, int p) {     t[p].l = l;     t[p].r = r;     if (l == r) {       t[p].val = a[l];       return;     }     int mid = (l + r) >> 1;     build(l, mid, p << 1);     build(mid + 1, r, p << 1 | 1);   }   void spread(int p) {     if (t[p].lazy != 0) {       int la = t[p].lazy;       t[p << 1].lazy = max(t[p << 1].lazy, la);       t[p << 1 | 1].lazy = max(t[p << 1 | 1].lazy, la);       t[p].lazy = 0;     }   }   void change(int pos, int x, int p) {     int L = t[p].l, R = t[p].r;     if (L == R) {       t[p].lazy = 0;       t[p].val = x;       return;     }     int mid = (L + R) >> 1;     spread(p);     if (pos <= mid)       change(pos, x, p << 1);     else       change(pos, x, p << 1 | 1);   }   void write(int p) {     int L = t[p].l, R = t[p].r;     if (L == R) {       cout << max(t[p].val, t[p].lazy) <<    ;       return;     }     int mid = (L + R) >> 1;     spread(p);     write(p << 1);     write(p << 1 | 1);   }   int main() {     cin >> n;     for (int i = 1; i <= n; i++) {       cin >> a[i];     }     build(1, n, 1);     cin >> q;     int C, pos, x;     for (int i = 1; i <= q; i++) {       cin >> C;       if (C == 1) {         cin >> pos >> x;         change(pos, x, 1);       } else {         cin >> x;         t[1].lazy = max(t[1].lazy, x);       }     }     write(1);     return 0;   }   