#include using namespace std; typedef long long ll; struct point { ll x, y, stat; point(int x=0, int y=0, int stat=0): x(x), y(y), stat(stat) {} bool operator<(const point &p) const { return y < p.y; } }; int main(void) { int n; scanf("%d", &n); vector Neg, Other; for (int i = 0; i < n; ++i) { point p; char res[5]; scanf("%lld%lld%s", &p.x, &p.y, res); p.stat = *res != 'N' ? *res == 'P' ? 1 : 0 : -1; if (p.stat < 0) Neg.push_back(p); else Other.push_back(p); } sort(Neg.begin(), Neg.end()); sort(Other.begin(), Other.end()); int other_start = 0; for (const auto &p: Neg) { while (other_start < Other.size() && Other[other_start].y <= p.y) ++other_start; for (int j = other_start; j < Other.size(); ++j) { auto &q = Other[j]; ll dx = q.x-p.x, dy = q.y-p.y; if (-dy <= 2*dx && 2*dx <= dy) { if (q.stat > 0) { printf("impossible\n"); return 0; } q.stat = -1; } } } vector Rem; for (const auto &p: Other) if (p.stat >= 0) Rem.push_back(p); sort(Rem.begin(), Rem.end(), [](const point &p, const point &q) { if (2*p.x + p.y != 2*q.x + q.y) return 2*p.x + p.y > 2*q.x + q.y; return -2*p.x + p.y > -2*q.x + q.y; }); int ans = 0; point *best_seen = &Rem[0], *best_taken = NULL; for (auto &p: Rem) { if (-2*best_seen->x + best_seen->y < -2*p.x + p.y) best_seen = &p; if (p.stat == 1 && (!best_taken || -2*best_taken->x + best_taken->y < -2*p.x + p.y)) { ++ans; best_taken = best_seen; } } printf("%d\n", ans); }