func_code_string: #include <bits/stdc++.h>   #define ff first   #define ss second   #define ll long long   #define ld long double   #define pb push_back   #define eb emplace_back   #define mp make_pair   #define mt make_tuple   #define pii pair<int, int>   #define pll pair<ll,ll>   #define vi vector<int>   #define vl vector<ll>   #define vii vector<pii>   #define sws ios_base::sync_with_stdio(false);cin.tie(NULL);cout.tie(NULL);   #define endl   n    #define teto(a, b) ((a+b-1)/(b))   using namespace std;      // Extra   #define forn(i, n) for(int i = 0; i < (int)n; i++)   #define forne(i, a, b) for(int i = a; i <= b; i++)   #define all(x) x.begin(), x.end()   #define dbg(msg, var) cout << msg <<     << var << endl;   //      const int MAX = 200010;   const ll MOD = (int)1e9 +7;   const int INF = 1e9;   const ll LLINF = 0x3f3f3f3f3f3f3f3f;   const ld EPS = 1e-8;      int n, l, r, s;   vector<vector<bool>> tab;   vector<vector<bool>> btab;      int dp(int idx, int soma) {       if(soma > s) return 0;       if(idx >= n) {           return (soma == s);       }       if(btab[idx][soma]) return tab[idx][soma];          // cout << idx <<     << soma << endl;       int res = 0;       int pega = dp(idx+1, soma + idx+1);       int npega = dp(idx+1, soma);          if(npega >= pega) {           res = npega;       }       else {           res = pega;       }          btab[idx][soma] = true;       return tab[idx][soma] = res;   }      vi solve(vi vals, int sz, bool& ruim) {       int t = vals.size();       vi foi(n+1, 0);       forn(i, t)           foi[vals[i]] = 1;          ruim = false;       while(t < sz and !ruim) {           bool brk = false;           forne(i, 1, n) {               if(!foi[i]) continue;               forne(j, 1, i-1) {                   if(j == i-j) continue;                   if(!foi[j] and !foi[i-j]) {                       foi[i] = 0;                       foi[j] = 1; foi[i-j] = 1;                       t++;                       brk = true;                       break;                   }               }               if(brk) break;           }           if(!brk) ruim = true;       }          return foi;   }      int32_t main() {       // sws;       int t;       cin >> t;          while(t--) {           cin >> n >> l >> r >> s;              tab.assign(n, vector<bool>(s+1, -1));           btab.assign(n, vector<bool>(s+1, 0));              bool win = dp(0, 0);           if(win) {               vi vals, p(n+1, -1);               set<int> pos;               forne(i, 1, n) pos.insert(i);                  int idx = 0, soma = 0;               while(idx < n) {                   if(dp(idx+1, soma)) {                       idx++;                   }                   else {                       soma += idx+1;                       vals.pb(idx+1);                       idx++;                   }               }                  if(vals.size() > (r-l+1)) {                   cout << -1 << endl;                   continue;               }                  bool ruim;               // for(auto val : vals) cout << val <<    ;               // cout << endl;                  vi foi = solve(vals, (r-l+1), ruim);               // cout <<  ruim =   << ruim << endl;                  // forne(i, 1, n) cout << foi[i] <<    ;               // cout << endl;                  if(ruim) cout << -1 << endl;               else {                   int id1 = 1, id2 = 1;                   forne(i, 1, n) {                       if(l <= i and i <= r) {                           while(id1 <= n and !foi[id1]) id1++;                           cout << id1 <<    ;                           id1++;                       }                       else {                           while(id2 <= n and foi[id2]) id2++;                           cout << id2 <<    ;                           id2++;                       }                   }                   cout << endl;               }              }           else {               cout << -1 << endl;           }       }          // verificar limites, long long       return 0;   }   