#include <bits/stdc++.h>
using namespace std;
template <typename T>
inline void ckmax(T& x, T y) {
  x = (y > x ? y : x);
}
template <typename T>
inline void ckmin(T& x, T y) {
  x = (y < x ? y : x);
}
const int MAXN = 1e5, MAXV = 1e5;
int trans(int x) { return x + MAXV + 1; }
int revtrans(int x) { return x - MAXV - 1; }
int n, q, a[MAXN + 5], ans[MAXV * 2 + 5];
struct SegmentTree {
  static const int SIZE = MAXV * 2 + 1;
  int rev[SIZE * 4 + 5], cov[SIZE * 4 + 5];
  void push_down(int p) {
    if (cov[p] != 0) {
      cov[p << 1] = cov[p];
      rev[p << 1] = 0;
      cov[p << 1 | 1] = cov[p];
      rev[p << 1 | 1] = 0;
      cov[p] = 0;
    }
    if (rev[p]) {
      rev[p << 1] ^= 1;
      rev[p << 1 | 1] ^= 1;
      rev[p] = 0;
    }
  }
  void modify_rev(int p, int l, int r, int ql, int qr) {
    if (ql <= l && qr >= r) {
      rev[p] ^= 1;
      return;
    }
    int mid = (l + r) >> 1;
    push_down(p);
    if (ql <= mid) modify_rev(p << 1, l, mid, ql, qr);
    if (qr > mid) modify_rev(p << 1 | 1, mid + 1, r, ql, qr);
  }
  void modify_cov(int p, int l, int r, int ql, int qr, int x) {
    if (ql <= l && qr >= r) {
      rev[p] = 0;
      cov[p] = x;
      return;
    }
    int mid = (l + r) >> 1;
    push_down(p);
    if (ql <= mid) modify_cov(p << 1, l, mid, ql, qr, x);
    if (qr > mid) modify_cov(p << 1 | 1, mid + 1, r, ql, qr, x);
  }
  void getans(int p, int l, int r) {
    if (l == r) {
      if (cov[p] != 0) {
        ans[l] = cov[p] * abs(revtrans(l));
      } else {
        ans[l] = revtrans(l);
      }
      if (rev[p] != 0) {
        ans[l] = -ans[l];
      }
      return;
    }
    int mid = (l + r) >> 1;
    push_down(p);
    getans(p << 1, l, mid);
    getans(p << 1 | 1, mid + 1, r);
  }
  SegmentTree() {}
} T;
int main() {
  cin >> n >> q;
  for (int i = 1; i <= n; ++i) cin >> a[i];
  for (int tq = 1; tq <= q; ++tq) {
    char s;
    int x;
    cin >> s >> x;
    if (s == '>') {
      if (x >= 0) {
        if (x < MAXV) {
          T.modify_cov(1, 1, T.SIZE, trans(x + 1), trans(MAXV), -1);
          T.modify_cov(1, 1, T.SIZE, trans(-MAXV), trans(-x - 1), -1);
        }
      } else {
        T.modify_rev(1, 1, T.SIZE, trans(x + 1), trans(-x - 1));
        T.modify_cov(1, 1, T.SIZE, trans(-x), trans(MAXV), -1);
        T.modify_cov(1, 1, T.SIZE, trans(-MAXV), trans(x), -1);
      }
    } else {
      if (x <= 0) {
        if (x > -MAXV) {
          T.modify_cov(1, 1, T.SIZE, trans(-MAXV), trans(x - 1), 1);
          T.modify_cov(1, 1, T.SIZE, trans(-x + 1), trans(MAXV), 1);
        }
      } else {
        T.modify_rev(1, 1, T.SIZE, trans(-x + 1), trans(x - 1));
        T.modify_cov(1, 1, T.SIZE, trans(x), trans(MAXV), 1);
        T.modify_cov(1, 1, T.SIZE, trans(-MAXV), trans(-x), 1);
      }
    }
  }
  T.getans(1, 1, T.SIZE);
  for (int i = 1; i <= n; ++i) {
    cout << ans[trans(a[i])] << " ";
  }
  cout << endl;
  return 0;
}
