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 (Clang 3.8.0) (judge verdict: Runtime Error)

#include<algorithm>
#include<cmath>
#include<iomanip>
#include<iostream>
#include<map>
#include<numeric>
#include<queue>
#include<set>
#include<sstream>
#include<unordered_map>
#include<unordered_set>
#include<vector>
using uint = unsigned int;
using ll = long long;
enum : int { M = (int)1e9 + 7 };
enum : ll { MLL = (ll)1e18L + 9 };
using namespace std;
#ifdef LOCAL
#include"rprint2.hpp"
#include"debug_deque.hpp"
#define vector DebugDeque
#else
#define FUNC(name) template <ostream& out = cout, class... T> void name(T&&...){ }
FUNC(prints) FUNC(printe) FUNC(printw) FUNC(printew) FUNC(printb) FUNC(printd) FUNC(printde);
#endif

int main(){
    cin.tie(0);
    ios::sync_with_stdio(false);
    int q; cin >> q;
    for(int _ = 0; _ < q; _++){
        int a, b, c, d;
        cin >> a >> b >> c >> d;
        int ma = max(a, b), mi = min(a, b);
        int out = 0, in = ma;
        while(out + 1 < in){
            int piv = (out + in) / 2;
            if((ma + piv - 1) / piv - 1 <= mi){
                in = piv;
            }else{
                out = piv;
            }
        }
        int size = in;

        // aaaa bb a bbb ... a bbb a bbb
        int tailReps = (b - 1) / size;
        int headAs = a - tailReps;
        int headBs = b - tailReps * size;
        int headReps = 0;
        printd(headReps, headAs, headBs, tailReps);
        while(headAs > size){
            if(headBs){
                headBs--;
                headAs -= size;
                headReps++;
            }
            if(headBs == 0 && tailReps){
                headAs++;
                headBs += size;
                tailReps--;
            }
        }
        printd(headReps, headAs, headBs, tailReps);

        if(a > 1e3 || b >= 1e3 || headAs < 0 || size < headBs){
            return 1;
        }

        // aaa b aaa b ... aaa b aa bb a bbb ... a bbb
        int width = size + 1;
        int idx = c - 1;
        // int idx = c / width * width;
        string str;
        int acc = headReps * width;
        while(idx < acc && (int)str.size() < d - c + 1){
            str += idx % width == size ? 'B' : 'A';
            idx++;
        }
        acc += headAs;
        while(idx < acc && (int)str.size() < d - c + 1){
            str += 'A';
            idx++;
        }
        acc += headBs;
        while(idx < acc && (int)str.size() < d - c + 1){
            str += 'B';
            idx++;
        }
        while((int)str.size() < d - c + 1){
            str += (idx - acc) % width ? 'B' : 'A';
            idx++;
        }
        printd(size);
        cout << str << '\n';
    }
}