#include <bits/stdc++.h>
using namespace std;
struct Point {
  long long x, y;
  Point() {}
  Point(long long x, long long y) : x(x), y(y){};
  Point operator+(Point p) { return Point(x + p.x, y + p.y); }
  Point operator-(Point p) { return Point(x - p.x, y - p.y); }
  bool operator<(const Point& p) const { return x != p.x ? x < p.x : y < p.y; }
  bool operator==(const Point& p) const { return x == p.x && y == p.y; }
};
long long dot(Point a, Point b) { return a.x * b.x + a.y * b.y; }
long long cross(Point a, Point b) { return a.x * b.y - a.y * b.x; }
static const int COUNTER_CLOCKWISE = 1;
static const int CLOCKWISE = -1;
int ccw(Point p0, Point p1, Point p2) {
  Point a = p1 - p0;
  Point b = p2 - p0;
  if (cross(a, b) > 0) return COUNTER_CLOCKWISE;
  return CLOCKWISE;
}
vector<Point> andrewScan(vector<Point> s) {
  vector<Point> u, l;
  if (s.size() < 3) return s;
  sort(s.begin(), s.end());
  u.push_back(s[0]);
  u.push_back(s[1]);
  l.push_back(s[s.size() - 1]);
  l.push_back(s[s.size() - 2]);
  for (int i = 2; i < s.size(); i++) {
    for (int n = u.size();
         n >= 2 && ccw(u[n - 2], u[n - 1], s[i]) == COUNTER_CLOCKWISE; n--)
      u.pop_back();
    u.push_back(s[i]);
  }
  for (int i = s.size() - 3; i >= 0; i--) {
    for (int n = l.size();
         n >= 2 && ccw(l[n - 2], l[n - 1], s[i]) == COUNTER_CLOCKWISE; n--)
      l.pop_back();
    l.push_back(s[i]);
  }
  reverse(l.begin(), l.end());
  for (int i = u.size() - 2; i >= 1; i--) l.push_back(u[i]);
  return l;
}
const int N = 2005;
char s[N];
Point p[N];
int used[N], ans[N];
int n;
int bruteFind(Point x) {
  for (int i = 1; i <= n; i++) {
    if (x == p[i]) return i;
  }
}
int main() {
  vector<Point> t, c;
  Point last;
  scanf("%d", &n);
  for (int i = 1; i <= n; i++) {
    scanf("%I64d %I64d", &p[i].x, &p[i].y);
    t.push_back(p[i]);
  }
  scanf("%s", s + 1);
  c = andrewScan(t);
  ans[1] = bruteFind(c[1]);
  used[ans[1]] = 1;
  if (s[1] == 'R')
    last = c[0];
  else
    last = c[2];
  for (int i = 2, sz; i <= n - 2; i++) {
    t.clear();
    for (int j = 1; j <= n; j++) {
      if (!used[j]) t.push_back(p[j]);
    }
    c = andrewScan(t);
    sz = (int)c.size();
    for (int j = 0; j < sz; j++) {
      if (last == c[j]) {
        ans[i] = bruteFind(last);
        used[ans[i]] = 1;
        if (s[i] == 'R')
          last = c[(j + sz - 1) % sz];
        else
          last = c[(j + 1) % sz];
        break;
      }
    }
  }
  ans[n - 1] = bruteFind(last);
  used[ans[n - 1]] = 1;
  for (int i = 1; i <= n; i++) {
    if (!used[i]) {
      ans[n] = i;
      break;
    }
  }
  for (int i = 1; i <= n; i++) printf("%d ", ans[i]);
  printf("\n");
  return 0;
}
