#include <bits/stdc++.h>
#pragma comment(linker, "/stack:200000000")
#pragma GCC optimize(2)
#pragma G++ optimize(2)
using namespace std;
constexpr long long N = 1e5 + 9;
constexpr long long M = 1e9 + 7;
constexpr long long INF = 0x3f3f3f3f3f3f3f3f;
constexpr long long INF2 = 0xcfcfcfcfcfcfcfcf;
struct Seg {
  long long l, m, r, id, v, tag;
  void build(long long id, long long s, long long e);
  Seg& L();
  Seg& R();
  long long query(long long x);
  void set(long long s, long long e, long long val);
  void flip(long long s, long long e);
  void pushdown();
} nodes[N * 8];
Seg& Seg::L() { return nodes[id * 2]; }
Seg& Seg::R() { return nodes[id * 2 + 1]; }
void Seg::build(long long id, long long s, long long e) {
  this->id = id, l = s, r = e, v = 1, tag = 0, m = (s + e) / 2;
  if (s != e) {
    L().build(id * 2, s, m);
    R().build(id * 2 + 1, m + 1, e);
  }
}
long long Seg::query(long long x) {
  if (l == r) return v;
  pushdown();
  if (x <= m) return L().query(x);
  return R().query(x);
}
void Seg::set(long long s, long long e, long long val) {
  if (l == s && r == e) {
    tag = val;
    if (l == r) v = val;
    return;
  }
  pushdown();
  if (e <= m)
    L().set(s, e, val);
  else if (s > m)
    R().set(s, e, val);
  else
    L().set(s, m, val), R().set(m + 1, e, val);
}
void Seg::flip(long long s, long long e) {
  if (l == s && r == e) {
    if (tag == 2)
      tag = 0;
    else if (tag == 0)
      tag = 2;
    else if (tag == 1)
      tag = -1;
    else if (tag == -1)
      tag = 1;
    if (l == r) v = -v;
    return;
  }
  pushdown();
  if (e <= m)
    L().flip(s, e);
  else if (s > m)
    R().flip(s, e);
  else
    L().flip(s, m), R().flip(m + 1, e);
}
void Seg::pushdown() {
  if (!tag) return;
  if (tag == 2) {
    L().flip(l, m);
    R().flip(m + 1, r);
  } else {
    L().set(l, m, tag);
    R().set(m + 1, r, tag);
  }
  tag = 0;
}
void init() { nodes[1].build(1, 0, 200000); }
void set(long long s, long long e, long long val) {
  if (s > e || s > 100000 || e < -100000) return;
  nodes[1].set(100000 + s, 100000 + e, val);
}
void flip(long long s, long long e) {
  if (s > e || s > 100000 || e < -100000) return;
  nodes[1].flip(100000 + s, 100000 + e);
}
long long query(long long x) { return nodes[1].query(100000 + x); }
long long n, q;
long long a[N];
signed main() {
  ios::sync_with_stdio(0), cin.tie(0), cout.tie(0);
  ;
  cin >> n >> q;
  init();
  for (long long i = 1; i <= n; i++) cin >> a[i];
  while (q--) {
    char op;
    long long x;
    cin >> op >> x;
    if (op == '>') {
      if (x >= 0) {
        ::set(x + 1, 100000, -1);
        ::set(-100000, -x - 1, 1);
      } else {
        ::flip(x + 1, -x - 1);
        ::set(-x, 100000, -1);
        ::set(-100000, x, 1);
      }
    } else {
      if (x >= 0) {
        ::set(x, 100000, 1);
        ::flip(-x + 1, x - 1);
        ::set(-100000, -x, -1);
      } else {
        ::set(-100000, x - 1, -1);
        ::set(-x + 1, 100000, 1);
      }
    }
  }
  for (long long i = 1; i <= n; i++) {
    cout << ::query(a[i]) * a[i] << " ";
  }
  cout << endl;
  return 0;
}
