Problem p02696 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define ll long long int
#define ld long double
#define fi first
#define se second
#define mod 1000000007
#define test                                                                   \
  long long int t;                                                             \
  cin >> t;                                                                    \
  while (t-- > 0)
#define fIO                                                                    \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);
#define loop(n) for (long long int i = 0; i < n; i++)
#define loopr(n) for (long long int i = n - 1; i >= 0; i--)
#define lrp(a, b) for (long long int i = a; i <= b; i++)
#define lrn(a, b) for (long long int i = b; i >= a; i--)
#define endl '\n'
#define ivec vector<ll>
#define ivecp vector<pair<ll, ll>>
#define imap map<ll, ll>
#define uimap unordered_map<ll, ll>
#define iset set<ll>
#define cvec vector<char>
#define civecp vector<pair<char, ll>>
#define cimap map<char, ll>
#define ucimap unordered_map<char, ll>
#define cset set<char>
#define rr return 0
using namespace std;
// Declaration
const ll N = 5e5 + 5;
vector<ll> adj[N];
// bool visited[N]={false};
ll parent[N];
ll rnk[N];
ll degree[N];
vector<ll> ax;

// Function call
bool isprime(ll n);
bool ispalin(ll num);
ll lcm(ll a, ll b);
ll power(ll x, unsigned ll y);
ll gcd(ll a, ll b);
ll sumofdigits(ll n);
void sorts(string &str);
bool sortinrev(const pair<ll, ll> &a, const pair<ll, ll> &b);
bool sortbysec(const pair<ll, ll> &a, const pair<ll, ll> &b);
void countSort(ll arr[], ll n, ll exp);
void radixsort(ll arr[], ll n);
void print(ll arr[], ll n);
void make(ll a);
ll find(ll a);
void Union(ll a, ll b);
ll mins(ll arr[], ll n, set<pair<ll, ll>> st);

// solve
void solve() {
  ll a, b, n;
  cin >> a >> b >> n;
  ll maxi = 0;
  for (ll i = min(n, b) / 2; i <= min(n, b); i++) {
    ll x = floor((a * i) / b) - a * (floor(i / b));
    if (x > maxi) {
      maxi = x;
    }
  }
  cout << maxi;
}

//--------------------------------------------------------------------------------------------------//
// Functions
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
ll lcm(ll a, ll b) { return (a * b) / __gcd(a, b); }
ll power(ll x, unsigned ll y) {
  ll temp;
  if (y == 0)
    return 1;
  temp = power(x, y / 2);
  if (y % 2 == 0)
    return temp * temp;
  else
    return x * temp * temp;
}
bool isPrime(ll num) {
  bool flag = true;
  for (ll i = 2; i <= num / 2; i++) {
    if (num % i == 0) {
      flag = false;
      break;
    }
  }
  return flag;
}
bool isPalin(ll num) {
  bool flag = false;
  ll digit, rev = 0, n = num;
  do {
    digit = num % 10;
    rev = (rev * 10) + digit;
    num = num / 10;
  } while (num != 0);
  if (rev == n)
    flag = true;
  return flag;
}
ll sumofdigits(ll n) {
  ll c = 0;
  while (n > 0) {
    c++;
    n /= 10;
  }
  return c;
}
bool sortinrev(const pair<ll, ll> &a, const pair<ll, ll> &b) {
  return (a.first > b.first);
}
bool sortbysec(const pair<ll, ll> &a, const pair<ll, ll> &b) {
  return (a.second < b.second);
}
string sortString(string &str) {
  sort(str.begin(), str.end());
  return str;
}
void countSort(ll arr[], ll n, ll exp) {
  ll output[n];
  ll i, count[10] = {0};
  for (i = 0; i < n; i++)
    count[(arr[i] / exp) % 10]++;
  for (i = 1; i < 10; i++)
    count[i] += count[i - 1];
  for (i = n - 1; i >= 0; i--) {
    output[count[(arr[i] / exp) % 10] - 1] = arr[i];
    count[(arr[i] / exp) % 10]--;
  }
  for (i = 0; i < n; i++)
    arr[i] = output[i];
}
void radixsort(ll arr[], ll n) {
  ll mx = arr[0];
  for (ll i = 1; i < n; i++)
    if (arr[i] > mx)
      mx = arr[i];
  ll m = mx;
  for (ll exp = 1; m / exp > 0; exp *= 10)
    countSort(arr, n, exp);
}
void print(ll arr[], ll n) {
  for (ll i = 0; i < n; i++)
    cout << arr[i] << " ";
}
// DSU//
void make(ll a) {
  parent[a] = a;
  rnk[a] = 1;
}
ll find(ll a) {
  if (parent[a] == a)
    return a;
  return parent[a] = find(parent[a]);
}
void Union(ll a, ll b) {
  a = find(a);
  b = find(b);
  if (a == b)
    return;
  if (rnk[a] > rnk[b]) {
    parent[b] = a;
    rnk[a] += rnk[b];
  } else {
    parent[a] = b;
    rnk[b] += rnk[a];
  }
}

// Driver Code
int main() {
  fIO solve();
  rr;
}


Fixed submission:
#include <algorithm>
#include <bits/stdc++.h>
#define mp make_pair
#define pb push_back
#define ll long long int
#define ld long double
#define fi first
#define se second
#define mod 1000000007
#define test                                                                   \
  long long int t;                                                             \
  cin >> t;                                                                    \
  while (t-- > 0)
#define fIO                                                                    \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);
#define loop(n) for (long long int i = 0; i < n; i++)
#define loopr(n) for (long long int i = n - 1; i >= 0; i--)
#define lrp(a, b) for (long long int i = a; i <= b; i++)
#define lrn(a, b) for (long long int i = b; i >= a; i--)
#define endl '\n'
#define ivec vector<ll>
#define ivecp vector<pair<ll, ll>>
#define imap map<ll, ll>
#define uimap unordered_map<ll, ll>
#define iset set<ll>
#define cvec vector<char>
#define civecp vector<pair<char, ll>>
#define cimap map<char, ll>
#define ucimap unordered_map<char, ll>
#define cset set<char>
#define rr return 0
using namespace std;
// Declaration
const ll N = 5e5 + 5;
vector<ll> adj[N];
// bool visited[N]={false};
ll parent[N];
ll rnk[N];
ll degree[N];
vector<ll> ax;

// Function call
bool isprime(ll n);
bool ispalin(ll num);
ll lcm(ll a, ll b);
ll power(ll x, unsigned ll y);
ll gcd(ll a, ll b);
ll sumofdigits(ll n);
void sorts(string &str);
bool sortinrev(const pair<ll, ll> &a, const pair<ll, ll> &b);
bool sortbysec(const pair<ll, ll> &a, const pair<ll, ll> &b);
void countSort(ll arr[], ll n, ll exp);
void radixsort(ll arr[], ll n);
void print(ll arr[], ll n);
void make(ll a);
ll find(ll a);
void Union(ll a, ll b);
ll mins(ll arr[], ll n, set<pair<ll, ll>> st);

// solve
void solve() {
  ll a, b, n;
  cin >> a >> b >> n;
  ll maxi = 0;
  ll j = min(n, b);
  ll c = 0;
  for (ll i = j; i >= 0; i--) {
    c++;
    if (c == 1000000)
      break;
    ll x = floor((a * i) / b) - a * (floor(i / b));
    if (x > maxi) {
      maxi = x;
    }
  }
  cout << maxi;
}

//--------------------------------------------------------------------------------------------------//
// Functions
ll gcd(ll a, ll b) {
  if (b == 0)
    return a;
  return gcd(b, a % b);
}
ll lcm(ll a, ll b) { return (a * b) / __gcd(a, b); }
ll power(ll x, unsigned ll y) {
  ll temp;
  if (y == 0)
    return 1;
  temp = power(x, y / 2);
  if (y % 2 == 0)
    return temp * temp;
  else
    return x * temp * temp;
}
bool isPrime(ll num) {
  bool flag = true;
  for (ll i = 2; i <= num / 2; i++) {
    if (num % i == 0) {
      flag = false;
      break;
    }
  }
  return flag;
}
bool isPalin(ll num) {
  bool flag = false;
  ll digit, rev = 0, n = num;
  do {
    digit = num % 10;
    rev = (rev * 10) + digit;
    num = num / 10;
  } while (num != 0);
  if (rev == n)
    flag = true;
  return flag;
}
ll sumofdigits(ll n) {
  ll c = 0;
  while (n > 0) {
    c++;
    n /= 10;
  }
  return c;
}
bool sortinrev(const pair<ll, ll> &a, const pair<ll, ll> &b) {
  return (a.first > b.first);
}
bool sortbysec(const pair<ll, ll> &a, const pair<ll, ll> &b) {
  return (a.second < b.second);
}
string sortString(string &str) {
  sort(str.begin(), str.end());
  return str;
}
void countSort(ll arr[], ll n, ll exp) {
  ll output[n];
  ll i, count[10] = {0};
  for (i = 0; i < n; i++)
    count[(arr[i] / exp) % 10]++;
  for (i = 1; i < 10; i++)
    count[i] += count[i - 1];
  for (i = n - 1; i >= 0; i--) {
    output[count[(arr[i] / exp) % 10] - 1] = arr[i];
    count[(arr[i] / exp) % 10]--;
  }
  for (i = 0; i < n; i++)
    arr[i] = output[i];
}
void radixsort(ll arr[], ll n) {
  ll mx = arr[0];
  for (ll i = 1; i < n; i++)
    if (arr[i] > mx)
      mx = arr[i];
  ll m = mx;
  for (ll exp = 1; m / exp > 0; exp *= 10)
    countSort(arr, n, exp);
}
void print(ll arr[], ll n) {
  for (ll i = 0; i < n; i++)
    cout << arr[i] << " ";
}
// DSU//
void make(ll a) {
  parent[a] = a;
  rnk[a] = 1;
}
ll find(ll a) {
  if (parent[a] == a)
    return a;
  return parent[a] = find(parent[a]);
}
void Union(ll a, ll b) {
  a = find(a);
  b = find(b);
  if (a == b)
    return;
  if (rnk[a] > rnk[b]) {
    parent[b] = a;
    rnk[a] += rnk[b];
  } else {
    parent[a] = b;
    rnk[b] += rnk[a];
  }
}

// Driver Code
int main() {
  fIO solve();
  rr;
}