1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
#include <bits/stdc++.h>
#define PB push_back
#define ST first
#define ND second

//#pragma GCC optimize ("O3")
//#pragma GCC target("tune=native")

//mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
//#include <ext/pb_ds/assoc_container.hpp>
//#include <ext/pb_ds/tree_policy.hpp>
//using namespace __gnu_pbds;
//typedef tree<int, null_type, less_equal<int>, rb_tree_tag, tree_order_statistics_node_update> ordered_set;

using namespace std;
using ll = long long;
using pi = pair<int, int>;
using vi = vector<int>;

const int nax = 500 * 1000 + 10;
int n;
pi a[nax];
bool ans[nax];

int main() {
	ios_base::sync_with_stdio(0);
	cin.tie(0);
	cin >> n;
	for(int i = 0; i < n; ++i) {
		cin >> a[i].ST;
		a[i].ND = i;
	}
	sort(a, a + n);
	int low = 0, high = n - 1, mid;
	while(low <= high) {
		mid = (low + high) / 2;
		ll cur = a[mid].ST;
		bool ok = true;
		for(int i = 0; i < n; ++i) {
			if(i == mid) continue;
			if(a[i].ST >= cur) {
				ok = false;
				break;
			}
			cur += a[i].ST;
		}
		if(ok) {
			high = mid - 1;
		} else {
			low = mid + 1;
		}	
	}
	high++;
	for(int i = high; i < n; ++i) {
		ans[a[i].ND] = true;
	}
	for(int i = 0; i < n; ++i) {
		if(ans[i]) cout << "T";
		else cout << "N";
	}
}