Problem p02786 (C++)

Buggy submission (status: Time Limit Exceeded):
// #include <ext/pb_ds/assoc_container.hpp>
//  #include <ext/pb_ds/tree_policy.hpp>
#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <valarray>
#include <vector>
using namespace std;
#define IOS                                                                    \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);                                                               \
  cout.tie(NULL);
#define trace(x) cerr << #x << ": " << x << " " << endl;

typedef int64_t ll;

#define endl '\n'
#define int ll
ll mod = 1e9 + 7;
ll mod1 = 1e9 + 5;

ll power(ll a, ll b) {
  if (b == 0)
    return 1;
  else if (b % 2 == 0)
    return power((((a % mod) * (a % mod)) % mod), b / 2) % mod;
  else
    return ((a % mod) * (power((((a % mod) * (a % mod)) % mod), b / 2) % mod)) %
           mod;
}

// using namespace __gnu_pbds;
// #define ordered_set tree<pair<int,int>, null_type,less<pair<int,int>>,
// rb_tree_tag,tree_order_statistics_node_update>
// find_by_order(k)  returns iterator to kth element starting from 0;
// order_of_key(k) returns count of elements strictly smaller than k;
// erase,insert same as normal set

int32_t main() {
  IOS

      int h;
  cin >> h;
  multiset<int> m;
  m.insert(h);
  map<int, int> m1;
  int ans = 0;
  m1[h]++;
  while (1) {
    if (m.size() == 0)
      break;
    int x = *m.rbegin();
    if (m.find(x) != m.end())
      m.erase(m.find(x));
    ans += m1[x];

    if ((x / 2) == 1) {
      ans += 2 * m1[x];
      continue;
    } else {
      int te = x;
      x /= 2;
      m.insert(x);
      m1[x] += 2 * m1[te];
    }
  }
  cout << ans << endl;
}


Fixed submission:
// #include <ext/pb_ds/assoc_container.hpp>
//  #include <ext/pb_ds/tree_policy.hpp>
#include <algorithm>
#include <cassert>
#include <cmath>
#include <cstring>
#include <deque>
#include <functional>
#include <iomanip>
#include <iostream>
#include <iterator>
#include <limits>
#include <map>
#include <numeric>
#include <queue>
#include <set>
#include <sstream>
#include <stack>
#include <unordered_map>
#include <unordered_set>
#include <valarray>
#include <vector>
using namespace std;
#define IOS                                                                    \
  ios_base::sync_with_stdio(false);                                            \
  cin.tie(NULL);                                                               \
  cout.tie(NULL);
#define trace(x) cerr << #x << ": " << x << " " << endl;

typedef int64_t ll;

#define endl '\n'
#define int ll
ll mod = 1e9 + 7;
ll mod1 = 1e9 + 5;

ll power(ll a, ll b) {
  if (b == 0)
    return 1;
  else if (b % 2 == 0)
    return power((((a % mod) * (a % mod)) % mod), b / 2) % mod;
  else
    return ((a % mod) * (power((((a % mod) * (a % mod)) % mod), b / 2) % mod)) %
           mod;
}

// using namespace __gnu_pbds;
// #define ordered_set tree<pair<int,int>, null_type,less<pair<int,int>>,
// rb_tree_tag,tree_order_statistics_node_update>
// find_by_order(k)  returns iterator to kth element starting from 0;
// order_of_key(k) returns count of elements strictly smaller than k;
// erase,insert same as normal set

int32_t main() {
  IOS

      int h;
  cin >> h;
  if (h == 1) {
    cout << 1;
    return 0;
  }
  multiset<int> m;
  m.insert(h);
  map<int, int> m1;
  int ans = 0;
  m1[h]++;
  while (1) {
    if (m.size() == 0)
      break;
    int x = *m.rbegin();
    if (m.find(x) != m.end())
      m.erase(m.find(x));
    ans += m1[x];

    if ((x / 2) == 1) {
      ans += 2 * m1[x];
      continue;
    } else {
      int te = x;
      x /= 2;
      m.insert(x);
      m1[x] += 2 * m1[te];
    }
  }
  cout << ans << endl;
}