Problem p02690 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <algorithm>
#include <bitset>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stdint.h>
#include <string>
#include <vector>

using namespace std;

#define PI (3.14159265358979323846)
#define INF (2147483647)
#define INF_LL (9223372036854775807)
#define DIV_NUM (1000000007)
typedef long long ll;

// 配列初期化テンプレ
template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}

template <typename A> bool cmp(const A &data, const A &key) {
  // data < keyを判定する
  return data < key;
}

template <typename A>
size_t customSearch(const vector<A> &data, const size_t &N, const A &key) {
  int lo = 0;
  int hi = N;                // data array size
  while (lo < hi) {          // lo=hiの１点に収束するまで続ける
    int mid = (lo + hi) / 2; // loとhiの中間地点の値を確認
    if (cmp(data[mid], key))
      lo = mid + 1; // LISの値より入力が大きかったら、loを持ち上げる
    else
      hi = mid; // LISの値が入力より小さかったら、hiを下げる
  }
  return lo; // lo：input <= key となる最初のindex
}

map<long long, long long> fract;

int main() {

  long long X;
  cin >> X;

  long long max_range = sqrt(sqrt(X));
  long long A = 0;
  long long B = 0;

  for (long long i = 0; i < max_range; i++) {
    fract.insert(make_pair(pow(i, 5), i));
  }

  while (true) {

    A++;

    long long A5 = pow(A, 5);

    long long key = A5 - X;

    // 要素の検索
    map<long long, long long>::iterator ite;
    ite = fract.find(abs(key));
    if (ite != fract.end()) {
      // 値の取得
      B = ite->second;
      if (key < 0)
        B = -1 * B;
      break;
    }
  }

  cout << A << " " << B << endl;

  return 0;
}


Error: TLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <queue>
#include <set>
#include <stdint.h>
#include <string>
#include <vector>

using namespace std;

#define PI (3.14159265358979323846)
#define INF (2147483647)
#define INF_LL (9223372036854775807)
#define DIV_NUM (1000000007)
typedef long long ll;

// 配列初期化テンプレ
template <typename A, size_t N, typename T>
void Fill(A (&array)[N], const T &val) {
  std::fill((T *)array, (T *)(array + N), val);
}

template <typename A> bool cmp(const A &data, const A &key) {
  // data < keyを判定する
  return data < key;
}

template <typename A>
size_t customSearch(const vector<A> &data, const size_t &N, const A &key) {
  int lo = 0;
  int hi = N;                // data array size
  while (lo < hi) {          // lo=hiの１点に収束するまで続ける
    int mid = (lo + hi) / 2; // loとhiの中間地点の値を確認
    if (cmp(data[mid], key))
      lo = mid + 1; // LISの値より入力が大きかったら、loを持ち上げる
    else
      hi = mid; // LISの値が入力より小さかったら、hiを下げる
  }
  return lo; // lo：input <= key となる最初のindex
}

int main() {

  long long X;
  cin >> X;

  long long A = 0;
  long long B = 0;

  while (true) {

    A++;

    long long A5 = pow(A, 5);

    long long key = A5 - X;
    long long lo = 0;
    long long hi = key; // data array size

    if (key == 0) {
      B = 0;
      break;
    } else if (key == 1) {
      B = 1;
      break;
    } else if (key == -1) {
      B = -1;
      break;
    }
    if (key > 0) {
      hi = key / 30;
    } else if (key < 0) {
      lo = 0;
      hi = -key / 30;
    }
    long long B5 = 0;
    while (lo < hi) { // lo=hiの１点に収束するまで続ける
      long long mid = (lo + hi) / 2; // loとhiの中間地点の値を確認
      B5 = pow(mid, 5);
      if (B5 < abs(key))
        lo = mid + 1; // B^5がkeyより小さかったら、loを持ち上げる
      else
        hi = mid; // B^5がkeyより大きかったら、hiを下げる
    }
    if (pow(lo, 5) == abs(key)) {
      B = lo * key / abs(key);
      break; // ぴったりの値が見つかったらそれが答え
    }
  }

  cout << A << " " << B << endl;

  return 0;
}