#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;
}
