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: Time Limit Exceeded)

#pragma GCC optimize("O2")
#pragma GCC optimize("unroll-loops")
#pragma GCC target("avx")
#include<bits/stdc++.h>
#define all(x) x.begin(), x.end()
using namespace std;
using vi = vector<int>;
const int maxn = 303;
char get(int a, int b, int s, int l, int i) {
	if(i < l + (l/s)) return i%(s+1) == s ? 'B' : 'A';
	if(i >= a + b - (a-l-1)*(s+1)) {
		i -= a + b - (a-l-1)*(s+1);
		return i%(s+1) == 0 ? 'A' : 'B';
	}
	i -= l + (l/s);
	return i == 0 ? 'A' : 'B';
}
void solve() {
	int A, B, C, D, rev = 0;
	cin >> A >> B >> C >> D;
	if(A < B) swap(A, B), rev = 1;
	int S = (A+B)/(B+1);
	int l = 0;
	for(int i = 1<<27; i>>=1;) {
		l += i;
		if(l > A || ((l/S) + (A-l-1)*1ll*S < B+(l==A))) l-= i;
	}
	while(((l/S) + (A-l-1)*1ll*S >= B+(l==A))) l++;
	//cout << l << '\n';
	C--, D--;
	while(C <= D) {
		if(!rev) cout << get(A, B, S, l, C);
		else cout << char(get(A, B, S, l, A+B-C-1)^'A'^'B');
		C++;
	}
	cout << '\n';
}
int main() {
	cin.tie(0)->sync_with_stdio(0);
	int t;
	cin >> t;
	while(t--) solve();
}
//0 1 0 1 0 1 0 1 2 2