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;
int a,b,l,r,len,row;
char st[1000100];
bool check(int a,int b,int len,int rem)//a<b
{
	if (a<=b)
	{
		if (len*(a+1)<b) return false;
		return true;
	}
	else
	{
		if (len*b+rem<a) return false;
		return true;
	}
}
int main()
{
	int q;scanf("%d",&q);
	while (q--)
	{
		scanf("%d%d%d%d",&a,&b,&l,&r);
		if (a<=b)
		{
			len=max(b/(a+1)+10,1);
			while ((len-1)*(a+1)>=b) len--;//cerr<<len<<endl;
			int ths=0,ra=a,rb=b;
			for (int i=1;i<=a+b;i++)
			{
				if ((ths<len)&&(check(ra-1,rb,len,len-ths-1))&&(ra)) {st[i]='A';ths++;ra--;}
				else {ths=0;st[i]='B';rb--;}
			}
			for (int i=l;i<=r;i++) putchar(st[i]);
		}
		else
		{
			int len=max(a/(b+1)+10,1);
			while ((len-1)*(b+1)>=a) len--;
			int ths=0,ra=a,rb=b;
			for (int i=1;i<=a+b;i++)
			{
				if ((ths<len)&&(check(ra-1,rb,len,len-ths-1))&&(ra)) {st[i]='A';ths++;ra--;}
				else {ths=0;st[i]='B';rb--;}
			}
			for (int i=l;i<=r;i++) putchar(st[i]);
		}
		printf("\n");
	}
}