Problem:
Score : 1100 points

Problem Statement

Let f(A, B), where A and B are positive integers, be the string satisfying the following conditions:

f(A, B) has length A + B;

f(A, B) contains exactly A letters A and exactly B letters B;

The length of the longest substring of f(A, B) consisting of equal letters (ex., AAAAA or BBBB) is as small as possible under the conditions above;

f(A, B) is the lexicographically smallest string satisfying the conditions above.

For example, f(2, 3) = BABAB, and f(6, 4) = AABAABAABB.

Answer Q queries: find the substring of f(A_i, B_i) from position C_i to position D_i (1-based).

Constraints

1 \leq Q \leq 10^3

1 \leq A_i, B_i \leq 5 \times 10^8

1 \leq C_i \leq D_i \leq A_i + B_i

D_i - C_i + 1 \leq 100

All input values are integers.

Partial Score

500 points will be awarded for passing the testset satisfying 1 \leq A_i, B_i \leq 10^3.

Input

Input is given from Standard Input in the following format:

Q
A_1 B_1 C_1 D_1
A_2 B_2 C_2 D_2
:
A_Q B_Q C_Q D_Q

Output

For each query i in order of input, print a line containing the substring of f(A_i, B_i) from position C_i to position D_i (1-based).

Sample Input 1

5
2 3 1 5
6 4 1 10
2 3 4 4
6 4 3 7
8 10 5 8

Sample Output 1

BABAB
AABAABAABB
A
BAABA
ABAB

Solution in C++14 (GCC 5.4.1) (judge verdict: Runtime Error)

#include <bits/stdc++.h>
using namespace std;
using lint = long long;
template<class T = int> using V = vector<T>;
template<class T = int> using VV = V< V<T> >;

int main() {
  cin.tie(nullptr); ios::sync_with_stdio(false);
  int q; cin >> q;
  while (q--) {
    int a, b, c, d; cin >> a >> b >> c >> d, --c;
    int k = (a + b) / (min(a, b) + 1);
    string l;
    while (l.size() < a + b) {
      l += string(k, 'A');
      l += 'B';
    }
    l.resize(a + b);
    string r = l;
    reverse(begin(r), end(r));
    for (auto&& e : r) {
      e = 'A' + 'B' - e;
    }
    string res = "C";
    auto chk = [&](const string& s) -> bool {
      int n = s.size(), t;
      for (int i = 0; i < n; ++i) {
        if (!i or s[i] != s[i - 1]) t = 1;
        else ++t;
        if (t > k) return false;
      }
      return true;
    };
    V<> cl(a + b + 1), cr(a + b + 1);
    for (int i = 0; i < a + b; ++i) {
      cl[i + 1] = cl[i] + (l[i] == 'A');
      cr[i + 1] = cr[i] + (r[i] == 'A');
    }
    for (int m = 0; m <= a + b; ++m) {
      if (cl[m] + cr[a + b] - cr[m] != a) continue;
      auto s = l.substr(0, m) + r.substr(m);
      if (chk(s) and s < res) {
        res = s;
      }
    }
    cout << res.substr(c, d - c) << '\n';
  }
}