#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
#include <string>
#include <set>
#include <map>
#include <queue>
typedef long long ll;
typedef long double ld;
using namespace std;

const int inf = 1e9 + 79;
class segment_tree_mini // chceme vediet najst minimum na intervale. 
{
    int n;
    vector<int> v;
public:
    segment_tree_mini(int n2) :n(n2), v(vector<int>(n2 * 2, inf)) {}
    void update(int x, int val)
    {
        if (x >= n) return;
        x += n;
        v[x] = min(v[x], val);
        for (x = x >> 1; x > 0; x >>= 1) v[x] = min(v[x << 1], v[x << 1 | 1]);
    }
    int query(int l, int r)
    {
        int ans = inf;
        for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1)
        {
            if (l & 1) ans = min(ans, v[l++]);
            if (r & 1) ans = min(ans, v[--r]);
        }
        return ans;
    }
};
class segment_tree_maxi // chceme vediet najst minimum na intervale. 
{
    int n;
    vector<int> v;
public:
    segment_tree_maxi(int n2) :n(n2), v(vector<int>(n2 * 2, -inf)) {}
    void update(int x, int val)
    {
        x += n;
        v[x] = max(v[x], val);
        for (x = x >> 1; x > 0; x >>= 1) v[x] = max(v[x << 1], v[x << 1 | 1]);
    }
    int query(int l, int r)
    {
        int ans = -inf;
        for (l += n, r += n + 1; l < r; l >>= 1, r >>= 1)
        {
            if (l & 1) ans = max(ans, v[l++]);
            if (r & 1) ans = max(ans, v[--r]);
        }
        return ans;
    }
};
int main()
{
    ios::sync_with_stdio(false);
    cin.tie(0);
    int t;
    cin >> t;
    while (t--)
    {
        int n;
        cin >> n;
        vector<int> p(n);
        segment_tree_maxi r(n + 1); segment_tree_mini dpmin(n + 1);
        for (int i = 0; i < n; i++)
        {
            cin >> p[i];
            r.update(i, i + p[i]);
        }
        vector<int> dp(n + 1, 0); // prvy lampion ktory nevieme pokryt prvymi i lampionmi
        vector<pair<int, bool> > pv(n + 1, { -1, 0 }); // (predosly stav, isli sme dolava?)
        dpmin.update(0, 0);
        for (int i = 0; i < n; i++)
        {
            // ideme skusit ze tento lampion je uz pokryty predoslym
            if (dp[i] > i) dp[i + 1] = max(dp[i], i + p[i] + 1), pv[i + 1] = { i, false };
            // ideme skusit ze tento lampion pokryje niekolko predoslych
            int best = dpmin.query(i - p[i], i - 1);
            if (best < inf)
            {
                int val = max(i, r.query(best, i - 1) + 1);
                if (val > dp[i + 1]) dp[i + 1] = val, pv[i + 1] = { best, true };
            }
            dpmin.update(dp[i + 1], i + 1);
        }
        if (dp[n] >= n)
        {
            cout << "YES\n";
            string ans(n, 'R');
            int cur = n;
            while (cur != 0)
            {
                if (pv[cur].second) ans[cur - 1] = 'L';
                cur = pv[cur].first;
            }
            cout << ans << "\n";
        }
        else cout << "NO\n";
    }
    return 0;
}