#include <bits/stdc++.h>
using namespace std;
const int MAXN = 1e5 + 10;
struct Seg {
  int tr[MAXN << 2], lazyc[MAXN << 2], lazyx[MAXN << 2];
  void build(int l, int r, int rt) {
    lazyc[rt] = 0;
    lazyx[rt] = -1;
    if (l == r) {
      return;
    }
    int mid = (l + r) >> 1;
    build(l, mid, rt << 1);
    build(mid + 1, r, rt << 1 | 1);
  }
  void push_down(int rt) {
    if (lazyc[rt] != 0) {
      lazyc[rt << 1] = lazyc[rt << 1 | 1] = lazyc[rt];
      lazyx[rt << 1] = lazyx[rt << 1 | 1] = -1;
      tr[rt << 1] = tr[rt << 1 | 1] = lazyc[rt];
      lazyc[rt] = 0;
    }
    if (lazyx[rt] != -1) {
      lazyx[rt << 1] = -lazyx[rt << 1];
      lazyx[rt << 1 | 1] = -lazyx[rt << 1 | 1];
      tr[rt << 1] = -tr[rt << 1];
      tr[rt << 1 | 1] = -tr[rt << 1 | 1];
      lazyx[rt] = -1;
    }
  }
  void update(int L, int R, int val, int l, int r, int rt) {
    if (L > R) return;
    if (L <= l && r <= R) {
      tr[rt] = val;
      lazyc[rt] = val;
      lazyx[rt] = -1;
      return;
    }
    push_down(rt);
    int mid = (l + r) >> 1;
    if (mid >= L) update(L, R, val, l, mid, rt << 1);
    if (mid + 1 <= R) update(L, R, val, mid + 1, r, rt << 1 | 1);
  }
  void updxor(int L, int R, int l, int r, int rt) {
    if (L > R) return;
    if (L <= l && r <= R) {
      tr[rt] = -tr[rt];
      lazyx[rt] = -lazyx[rt];
      return;
    }
    push_down(rt);
    int mid = (l + r) >> 1;
    if (mid >= L) updxor(L, R, l, mid, rt << 1);
    if (mid + 1 <= R) updxor(L, R, mid + 1, r, rt << 1 | 1);
  }
  int query(int pos, int l, int r, int rt) {
    if (l == r) {
      return tr[rt];
    }
    push_down(rt);
    int mid = (l + r) >> 1;
    if (pos <= mid)
      return query(pos, l, mid, rt << 1);
    else
      return query(pos, mid + 1, r, rt << 1 | 1);
  }
} pos, neg;
int a[MAXN];
int n, q, mx = 100000;
void ans() {
  for (int i = 1; i <= n; i++) {
    if (a[i] > 0) {
      printf("%d ", pos.query(a[i], 1, mx, 1) == 1 ? a[i] : -a[i]);
    } else if (a[i] < 0) {
      printf("%d ", neg.query(-a[i], 1, mx, 1) == -1 ? a[i] : -a[i]);
    } else {
      printf("0 ");
    }
  }
  puts("");
}
int main() {
  scanf("%d%d", &n, &q);
  for (int i = 1; i <= n; i++) {
    scanf("%d", &a[i]);
  }
  pos.build(1, mx, 1);
  neg.build(1, mx, 1);
  pos.update(1, mx, 1, 1, mx, 1);
  neg.update(1, mx, -1, 1, mx, 1);
  while (q--) {
    char op[5];
    int x;
    scanf("%s%d", op, &x);
    if (op[0] == '>') {
      if (x == 0) {
        pos.update(1, mx, -1, 1, mx, 1);
        neg.update(1, mx, -1, 1, mx, 1);
      } else if (x > 0) {
        pos.update(x + 1, mx, -1, 1, mx, 1);
        neg.update(x + 1, mx, -1, 1, mx, 1);
      } else if (x < 0) {
        pos.update(-x, mx, -1, 1, mx, 1);
        neg.update(-x, mx, -1, 1, mx, 1);
        pos.updxor(1, -x - 1, 1, mx, 1);
        neg.updxor(1, -x - 1, 1, mx, 1);
      }
    } else if (op[0] == '<') {
      if (x == 0) {
        pos.update(1, mx, 1, 1, mx, 1);
        neg.update(1, mx, 1, 1, mx, 1);
      } else if (x < 0) {
        pos.update(-x + 1, mx, 1, 1, mx, 1);
        neg.update(-x + 1, mx, 1, 1, mx, 1);
      } else if (x > 0) {
        pos.update(x, mx, 1, 1, mx, 1);
        neg.update(x, mx, 1, 1, mx, 1);
        pos.updxor(1, x - 1, 1, mx, 1);
        neg.updxor(1, x - 1, 1, mx, 1);
      }
    }
  }
  ans();
  return 0;
}
