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: Wrong Answer)

#include<iostream>
using namespace std;
int a, b, st, dr, mid, poz, i, k, t, a2, b2, c, d, x, p;
char sol[105];
int main(){
    cin>> t;
    for(; t; t--){
        cin>> a >> b >> c >> d;
        if(a > b){
            k = a / (b + 1);
            if(a % (b + 1) != 0){
                k++;
            }
        }
        else{
            k = b / (a + 1);
            if(b % (a + 1) != 0){
                k++;
            }
        }
        st = 0;
        dr = a + b;
        while(st <= dr){
            mid = (st + dr) / 2;
            b2 = b - mid / (k + 1);
            a2 = a - mid / (k + 1) * k - mid % (k + 1);
            if(a2 < 0 || a2 * k < b2){
                dr = mid - 1;
            }
            else{
                st = mid + 1;
            }
        }
        poz = st;
        if(poz % (k + 1) == 0 && poz != 0){
            poz--;
        }
        sol[d - c + 1] = 0;
        if(c <= poz){
            x = c % (k + 1);
            if(x == 0){
                x = k + 1;
            }
            p = 0;
            for(i = c; i <= min(d, poz); i++){
                if(x == k + 1){
                    sol[i - c] = 'B';
                    x = 1;
                }
                else{
                    sol[i - c] = 'A';
                    x++;
                }
            }
            p = d - c;
            d = a + b - d + 1;
            x = d % (k + 1);
            if(x == 0){
                x = k + 1;
            }
            for(i = d; i <= a + b - poz; i++){
                if(x == k + 1){
                    sol[p--] = 'A';
                    x = 1;
                }
                else{
                    sol[p--] = 'B';
                    x++;
                }
            }
        }
        else{
            c -= poz;
            d -= poz;
            swap(c, d);
            c = a + b - poz - c + 1;
            d = a + b - poz - d + 1;
            x = c % (k + 1);
            if(x == 0){
                x = k + 1;
            }
            p = d - c;
            for(i = c; i <= d; i++){
                if(x == k + 1){
                    sol[p--] = 'A';
                    x = 1;
                }
                else{
                    sol[p--] = 'B';
                    x++;
                }
            }
        }
        cout<< sol <<"\n";
    }
}