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

#include <algorithm>
#include <bitset>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
using namespace std;
using ull = unsigned long long;
using ll = long long;
using prll = pair<ll, ll>;
constexpr ll MOD = 1000000007;           // 10億　= 10^9になってる
constexpr ll mINF = -922337200085470000; // llのmax-1桁の小さい方
constexpr ll pINF = 1LL << 60;
constexpr ull uINF = 1844674407399900000; // ullのmax-1桁してる
constexpr long double pi = 3.1415926535897932384;
constexpr ll juu = 100000;           // 10万 10e5
constexpr ll hyaku = 1000000;        // 100万　10e6
constexpr int dx[4] = {0, 0, 1, -1}; // 上下左右のベクトル
constexpr int dy[4] = {1, -1, 0, 0}; // 上下左右のベクトル
constexpr int ddx[8] = {0, 0, 1, -1, 1, 1, -1, -1};
constexpr int ddy[8] = {1, -1, 0, 0, -1, 1, 1, -1};
#define all(v) v.begin(), v.end()
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define Debug(xx) cerr << " DEBUG:" << xx << endl;
#define Debug2(xx, yy) cerr << " DEBUG:" << xx << ":" << yy << endl;
ll factor[300];
ll memory[300];
/*素朴法で計算
factorは必ずmemset(factor,0,sizeof(factor));
グローバルであるmemoryに個数を書き込む
memory配列の走査にはfactorの要素を使う*/
void primefac(ll num) {
  int i = 0, kosuu = 0;
  while (*(factor + i) != 0) {
    while (num % *(factor + i) == 0) {
      num /= *(factor + i);
      memory[*(factor + i)] += 1;
    }
    if (num == 1)
      break;
    i++;
  }
}
/*グローバルにあるfactorに素数書き込む.個数を返すので配列は-1しろforは<*/
int elast(ll number) {
  ll tmp = 0;
  int flag = 0;
  *factor = 2;
  for (int i = 3; i <= number; i++) {
    flag = 0;
    for (int j = 0; j <= tmp; j++) {
      if (i % (*(factor + j)) == 0) {
        flag = 1;
        break;
      }
    }
    if (flag)
      continue;
    tmp += 1;
    *(factor + tmp) = i;
  }
  return tmp + 2;
}
// 繰り返し二乗。掛けられる数、回数、mod
ll powpow(ll n, ll p) {
  if (p == 1)
    return n % MOD;
  if (p % 2 == 1) {
    return (n * powpow(n, p - 1)) % MOD;
  }
  ll dob = powpow(n, p / 2);
  return (dob * dob) % MOD;
}
// MODとn、rが互いに素である事が確定していないとこれは出来ない。小定理、またchild,parentでおかしくなる。
// mod取った後にそれら同士で割り算するとおかしくなるから逆元使う。（合同式の性質考えろ）
ll nCrMod(ll n, ll r) {
  ll child = 1;
  ll parent = 1;
  if (r == 0)
    return 1;
  for (ll i = 0; i < r; ++i) {
    child = child * (n - i) % MOD;
    parent = parent * (r - i) % MOD;
  }
  ll ans = child * powpow(parent, MOD - 2);
  return ans % MOD;
}
ll to_digit(ll num) { return (ll)(to_string(num).size()); }
ll nCr(ll n, ll r) {
  ll val = 1, val2 = 1;
  if (r == 0)
    return 1;
  if (n < r)
    return 0;
  for (ll i = 0; i < r; ++i) {
    val *= (n - i);
    val2 *= (r - i);
  }
  return val / val2;
}
ll nPr(ll n, ll r) {
  ll val = 1;
  for (ll i = 0; i < r; ++i) {
    val *= (n - i);
  }
  return val;
}
template <typename T> bool chmin(T &a, const T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T> bool chmax(T &a, const T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

/*ソートして被りを無くす*/
template <typename T> void eraseSame(T &a) {
  sort(all(a));
  a.erase(unique(all(a)), a.end());
}

/*aとbで大きい方を後ろにする。変更なしならtrue、ありならfalse */
template <typename T> bool swapmax(T &a, T &b) {
  T temp;
  temp = a;
  if (a > b) {
    a = b;
    b = temp;
    return false;
  }
  return true;
}
ll gcd(ll x, ll y) { return (x % y) ? gcd(y, x % y) : y; }
ll lcm(ll x, ll y) { return x / gcd(x, y) * y; }

/*一行に入力が何個あるかを1,ぶち込むvectorを2*/
template <typename T> void splitIn(ll N, vector<T> &array) {
  T temp;
  int i = 0;
  if (N == 0) {
    return;
  }
  array.resize(N);
  while (cin >> temp) {
    array[i] = temp;
    i++;
    if (i >= N) {
      break;
    }
  }
  return;
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  // cout << fixed << setprecision(20);
  int n, k, m, l;
  ll ans = 0;
  ll sum = 0;
  string s;
  vector<ll> v(10000, 0);
  int x, y;
  cin >> n >> x >> y;
  for (int i = 1; i < n; ++i) { // スタート
    for (int j = i + 1; j <= n; ++j) {
      sum = 0;
      if ((i <= x) && (y <= j)) {
        v[(x - i) + (j - y) + 1]++;
      }

      else if (((i <= x) && (j <= x)) || ((j >= y) && (i >= y))) {
        v[(j - i)]++;
      } else { // x -> y
        if (i < x) {
          sum = min(j - i, abs(x - i) + min(abs(j - x), abs(y - j) + 1));
        } else if (y < j) {
          sum = min(j - i, abs(j - y) + min(abs(i - y), abs(x - i) + 1));
        } else {
          sum = min(j - i, abs(i - x) + abs(y - j) + 1);
        }
        v[sum]++;
      }
    }
  }
  for (int i = 1; i <= n - 1; ++i)
    printf("%lld\\n", v[i]);
  return 0;
}

Error: TLE

Fixed submission:

#include <algorithm>
#include <bitset>
#include <cmath>
#include <complex>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <unordered_map>
#include <utility>
#include <vector>
using namespace std;
using ull = unsigned long long;
using ll = long long;
using prll = pair<ll, ll>;
constexpr ll MOD = 1000000007;           // 10億　= 10^9になってる
constexpr ll mINF = -922337200085470000; // llのmax-1桁の小さい方
constexpr ll pINF = 1LL << 60;
constexpr ull uINF = 1844674407399900000; // ullのmax-1桁してる
constexpr long double pi = 3.1415926535897932384;
constexpr ll juu = 100000;           // 10万 10e5
constexpr ll hyaku = 1000000;        // 100万　10e6
constexpr int dx[4] = {0, 0, 1, -1}; // 上下左右のベクトル
constexpr int dy[4] = {1, -1, 0, 0}; // 上下左右のベクトル
constexpr int ddx[8] = {0, 0, 1, -1, 1, 1, -1, -1};
constexpr int ddy[8] = {1, -1, 0, 0, -1, 1, 1, -1};
#define all(v) v.begin(), v.end()
#define rep(i, n) for (ll i = 0; i < (ll)(n); i++)
#define Debug(xx) cerr << " DEBUG:" << xx << endl;
#define Debug2(xx, yy) cerr << " DEBUG:" << xx << ":" << yy << endl;
ll factor[300];
ll memory[300];
/*素朴法で計算
factorは必ずmemset(factor,0,sizeof(factor));
グローバルであるmemoryに個数を書き込む
memory配列の走査にはfactorの要素を使う*/
void primefac(ll num) {
  int i = 0, kosuu = 0;
  while (*(factor + i) != 0) {
    while (num % *(factor + i) == 0) {
      num /= *(factor + i);
      memory[*(factor + i)] += 1;
    }
    if (num == 1)
      break;
    i++;
  }
}
/*グローバルにあるfactorに素数書き込む.個数を返すので配列は-1しろforは<*/
int elast(ll number) {
  ll tmp = 0;
  int flag = 0;
  *factor = 2;
  for (int i = 3; i <= number; i++) {
    flag = 0;
    for (int j = 0; j <= tmp; j++) {
      if (i % (*(factor + j)) == 0) {
        flag = 1;
        break;
      }
    }
    if (flag)
      continue;
    tmp += 1;
    *(factor + tmp) = i;
  }
  return tmp + 2;
}
// 繰り返し二乗。掛けられる数、回数、mod
ll powpow(ll n, ll p) {
  if (p == 1)
    return n % MOD;
  if (p % 2 == 1) {
    return (n * powpow(n, p - 1)) % MOD;
  }
  ll dob = powpow(n, p / 2);
  return (dob * dob) % MOD;
}
// MODとn、rが互いに素である事が確定していないとこれは出来ない。小定理、またchild,parentでおかしくなる。
// mod取った後にそれら同士で割り算するとおかしくなるから逆元使う。（合同式の性質考えろ）
ll nCrMod(ll n, ll r) {
  ll child = 1;
  ll parent = 1;
  if (r == 0)
    return 1;
  for (ll i = 0; i < r; ++i) {
    child = child * (n - i) % MOD;
    parent = parent * (r - i) % MOD;
  }
  ll ans = child * powpow(parent, MOD - 2);
  return ans % MOD;
}
ll to_digit(ll num) { return (ll)(to_string(num).size()); }
ll nCr(ll n, ll r) {
  ll val = 1, val2 = 1;
  if (r == 0)
    return 1;
  if (n < r)
    return 0;
  for (ll i = 0; i < r; ++i) {
    val *= (n - i);
    val2 *= (r - i);
  }
  return val / val2;
}
ll nPr(ll n, ll r) {
  ll val = 1;
  for (ll i = 0; i < r; ++i) {
    val *= (n - i);
  }
  return val;
}
template <typename T> bool chmin(T &a, const T b) {
  if (a > b) {
    a = b;
    return true;
  }
  return false;
}
template <typename T> bool chmax(T &a, const T b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}

/*ソートして被りを無くす*/
template <typename T> void eraseSame(T &a) {
  sort(all(a));
  a.erase(unique(all(a)), a.end());
}

/*aとbで大きい方を後ろにする。変更なしならtrue、ありならfalse */
template <typename T> bool swapmax(T &a, T &b) {
  T temp;
  temp = a;
  if (a > b) {
    a = b;
    b = temp;
    return false;
  }
  return true;
}
ll gcd(ll x, ll y) { return (x % y) ? gcd(y, x % y) : y; }
ll lcm(ll x, ll y) { return x / gcd(x, y) * y; }

/*一行に入力が何個あるかを1,ぶち込むvectorを2*/
template <typename T> void splitIn(ll N, vector<T> &array) {
  T temp;
  int i = 0;
  if (N == 0) {
    return;
  }
  array.resize(N);
  while (cin >> temp) {
    array[i] = temp;
    i++;
    if (i >= N) {
      break;
    }
  }
  return;
}
signed main() {
  ios::sync_with_stdio(false);
  cin.tie(0);
  // cout << fixed << setprecision(20);
  int n, k, m, l;
  ll ans = 0;
  ll sum = 0;
  string s;
  vector<ll> v(10000, 0);
  int x, y;
  cin >> n >> x >> y;
  for (int i = 1; i < n; ++i) { // スタート
    for (int j = i + 1; j <= n; ++j) {
      sum = 0;
      if ((i <= x) && (y <= j)) {
        v[(x - i) + (j - y) + 1]++;
        cerr << (x - i) + (j - y) + 1;
        Debug2(j, i)
      }

      else if (((i <= x) && (j <= x)) || ((j >= y) && (i >= y))) {
        v[(j - i)]++;
        cerr << j - i;
        Debug2(j, i)
      } else { // x -> y
        if (i < x) {
          sum = min(j - i, abs(x - i) + min(abs(j - x), abs(y - j) + 1));
        } else if (y < j) {
          sum = min(j - i, abs(j - y) + min(abs(i - y), abs(x - i) + 1));
        } else {
          sum = min(j - i, abs(i - x) + abs(y - j) + 1);
        }
        v[sum]++;
        cerr << sum;
        Debug2(j, i)
      }
    }
  }
  for (int i = 1; i <= n - 1; ++i)
    printf("%lld\\n", v[i]);
  return 0;
}