#include <bits/stdc++.h>
#pragma gcc optimize("O2")
#pragma g++ optimize("O2")
#define int long long
#define endl '\n'
using namespace std;
const int N = 1e7 + 10;
int a[N], root[N], ans[N];
namespace SegTree{
#define ls lc[rt]
#define rs rc[rt]
#define lson ls, id, l,
#define rson rs, id, mid + 1,
int lc[N], rc[N], tot = 0;
void update(int &rt, int id, int l, int r, int pos){
if(!rt) rt = ++tot;
if(l == r) return;
int mid = l + r >> 1;
if(mid >= pos) update(lson, pos);
else update(rson, pos);
}
int merge(int u, int v){
if(!u || !v) return u + v;
lc[u] = merge(lc[u], lc[v]);
rc[u] = merge(rc[u], rc[v]);
return u;
}
void modify(int &rt, int id, int l, int r, int L, int R, int &mod){
if(!rt) return;
if(l >= L && r <= R){
mod = merge(rt, mod);
rt = 0;
return;
}
if(!mod) mod = ++tot;
int mid = l + r >> 1;
if(mid >= L) modify(lson, L, R, lc[mod]);
if(mid < R) modify(rson, L, R, rc[mod]);
}
void getans(int rt, int id, int l, int r){
if(!rt) return;
if(l == r) return (void)(ans[l] = id);
int mid = l + r >> 1;
getans(lson), getans(rson);
}
}
inline void solve(){
int n = 0; cin >> n;
for(int i = 1; i <= n; i++) cin >> a[i];
for(int i = 1; i <= n; i++) SegTree::update(root[a[i]], a[i], 1, n, i);
int q = 0; cin >> q;
for(int i = 1; i <= q; i++){
int l, r, x, y; cin >> l >> r >> x >> y;
if(x == y) continue;
SegTree::modify(root[x], x, 1, n, l ,r, root[y]);
}
for(int i = 1; i <= 100; i++){
if(root[i]) SegTree::getans(root[i], i, 1, n);
}
for(int i = 1; i <= n; i++) cout << ans[i] << " \n"[i == n];
}
signed main(){
ios_base::sync_with_stdio(false), cin.tie(0);
solve();
return 0;
}