Problem p03466 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<ld, ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T>
using Tree =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i = a; i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define FORd(i, a, b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()

const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 100001;

int Q;

int cdiv(int a, int b) { return (a + b - 1) / b; }

int eval(int a, int b, int i, int L) {
  return i - i / (L + 1) + (a + b - i) / (L + 1);
}

bool ok(int a, int b, int i, int L) {
  if (i < 0 || i > a + b)
    return 0;
  if (eval(a, b, i, L) != a)
    return 0;
  if (i && a + b - i)
    if ((i % (L + 1) == 0) ^ ((a + b - i) % (L + 1) == 0))
      return 0;
  return 1;
}

vi get(int a, int b) {
  int L = cdiv(max(a, b), min(a, b) + 1);
  // if (a > b*L) return {a,b,L,a+b};
  // if (b > a*L) return {a,b,L,0};

  int lo = 0, hi = a + b;
  while (lo < hi) {
    int mid = (lo + hi) / 2;
    if (eval(a, b, mid, L) < a)
      lo = mid + 1;
    else
      hi = mid;
  }

  // cout << eval(a,b,lo,L) << " " << a << "\n";
  while (1) {
    if (ok(a, b, lo, L))
      return {a, b, L, lo};
    lo--;
    if (ok(a, b, hi, L))
      return {a, b, L, hi};
    hi++;
  }
}

string get(int L, int x, int c, int d) {
  d = min(d, x - 1);
  if (c > d)
    return "";
  string res;
  FOR(i, c, d + 1) {
    if ((i + 1) % (L + 1) == 0)
      res += 'B';
    else
      res += 'A';
  }
  return res;
}

string extract(vi x, int c, int d) {
  string s1 = get(x[2], x[3], c, d);
  string s2 =
      get(x[2], x[0] + x[1] - x[3], x[0] + x[1] - 1 - d, x[0] + x[1] - 1 - c);
  reverse(all(s2));
  for (char &c : s2)
    c = char('A' + (1 - (c - 'A')));
  return s1 + s2;
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> Q;
  F0R(i, Q) {
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    vi x = get(a, b);
    cout << extract(x, c - 1, d - 1) << "\n";
  }
}

// read the question correctly (is y a vowel? what are the exact constraints?)
// look out for SPECIAL CASES (n=1?) and overflow (ll vs int?) ARRAY OUT OF
// BOUNDSS

Fixed submission:
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>

using namespace std;
using namespace __gnu_pbds;

typedef long long ll;
typedef long double ld;
typedef complex<ld> cd;

typedef pair<int, int> pi;
typedef pair<ll, ll> pl;
typedef pair<ld, ld> pd;

typedef vector<int> vi;
typedef vector<ld> vd;
typedef vector<ll> vl;
typedef vector<pi> vpi;
typedef vector<pl> vpl;
typedef vector<cd> vcd;

template <class T>
using Tree =
    tree<T, null_type, less<T>, rb_tree_tag, tree_order_statistics_node_update>;

#define FOR(i, a, b) for (int i = a; i < (b); i++)
#define F0R(i, a) for (int i = 0; i < (a); i++)
#define FORd(i, a, b) for (int i = (b)-1; i >= a; i--)
#define F0Rd(i, a) for (int i = (a)-1; i >= 0; i--)

#define sz(x) (int)(x).size()
#define mp make_pair
#define pb push_back
#define f first
#define s second
#define lb lower_bound
#define ub upper_bound
#define all(x) x.begin(), x.end()

const int MOD = 1000000007;
const ll INF = 1e18;
const int MX = 100001;

int Q;

int cdiv(int a, int b) { return (a + b - 1) / b; }

int eval(int a, int b, int i, int L) {
  return i - i / (L + 1) + (a + b - i) / (L + 1);
}

bool ok(int a, int b, int i, int L) {
  if (i < 0 || i > a + b)
    return 0;
  if (eval(a, b, i, L) != a)
    return 0;
  if (i && a + b - i)
    if ((i % (L + 1) == 0) ^ ((a + b - i) % (L + 1) == 0))
      return 0;
  return 1;
}

vi get(int a, int b) {
  int L = cdiv(max(a, b), min(a, b) + 1);
  if (a > (ll)b * L)
    return {a, b, L, a + b};
  if (b > (ll)a * L)
    return {a, b, L, 0};

  int lo = 0, hi = a + b;
  while (lo < hi) {
    int mid = (lo + hi) / 2;
    if (eval(a, b, mid, L) < a)
      lo = mid + 1;
    else
      hi = mid;
  }

  // cout << eval(a,b,lo,L) << " " << a << "\n";
  while (1) {
    if (ok(a, b, lo, L))
      return {a, b, L, lo};
    lo--;
    if (ok(a, b, hi, L))
      return {a, b, L, hi};
    hi++;
  }
}

string get(int L, int x, int c, int d) {
  d = min(d, x - 1);
  if (c > d)
    return "";
  string res;
  FOR(i, c, d + 1) {
    if ((i + 1) % (L + 1) == 0)
      res += 'B';
    else
      res += 'A';
  }
  return res;
}

string extract(vi x, int c, int d) {
  string s1 = get(x[2], x[3], c, d);
  string s2 =
      get(x[2], x[0] + x[1] - x[3], x[0] + x[1] - 1 - d, x[0] + x[1] - 1 - c);
  reverse(all(s2));
  for (char &c : s2)
    c = char('A' + (1 - (c - 'A')));
  return s1 + s2;
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cin >> Q;
  F0R(i, Q) {
    int a, b, c, d;
    cin >> a >> b >> c >> d;
    vi x = get(a, b);
    cout << extract(x, c - 1, d - 1) << "\n";
  }
}

// read the question correctly (is y a vowel? what are the exact constraints?)
// look out for SPECIAL CASES (n=1?) and overflow (ll vs int?) ARRAY OUT OF
// BOUNDSS