Problem p03201 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>

#define REP(i, n) for (int i = 0; i < n; i++)
#define REPR(i, n) for (int i = n; i >= 0; i--)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define FORR(i, m, n) for (int i = m; i >= n; i--)
#define SORT(v, n) sort(v, v + n);
#define VSORT(v) sort(v.begin(), v.end());
#define REVERSE(v, n) reverse(v, v + n);
#define VREVERSE(v) reverse(v.begin(), v.end());
#define ll long long
#define pb(a) push_back(a)
#define INF 999999999
#define m0(x) memset(x, 0, sizeof(x))
#define fill(x, y) memset(x, y, sizeof(x))

using namespace std;

int dy[4] = {0, 0, 1, -1};
int dx[4] = {1, -1, 0, 0};
int dxx[8] = {0, 0, 1, 1, 1, -1, -1, -1};
int dyy[8] = {1, -1, 0, 1, -1, 0, 1, -1};

ll gcd(ll x, ll y) {
  ll m = max(x, y), n = min(x, y);
  if (m % n == 0)
    return n;
  else
    return gcd(m % n, n);
}
ll lcm(ll x, ll y) { return x / gcd(x, y) * y; }

ll myPow(ll x, ll n, ll m) {
  if (n == 0)
    return 1;
  if (n % 2 == 0)
    return myPow(x * x % m, n / 2, m);
  else
    return x * myPow(x, n - 1, m) % m;
}

ll pow2(int a, int n) { // aのn乗を計算します。
  int x = 1;
  while (n > 0) { // 全てのbitが捨てられるまで。
    if (n & 1) {  // 1番右のbitが1のとき。
      x = x * a;
    }
    a = a * a;
    n >>= 1; // bit全体を右に1つシフトして一番右を捨てる。
  }
  return x;
}

long long nCr(int n, int r) {
  if (r > n / 2)
    r = n - r; // because C(n, r) == C(n, n - r)
  long long ans = 1;
  int i;

  for (i = 1; i <= r; i++) {
    ans *= n - r + i;
    ans /= i;
  }

  return ans;
}

const int MOD = 1000000007;
vector<int> v;
map<int, int> mp;
int main() {
  int N;
  cin >> N;
  REP(i, N) {
    int A;
    cin >> A;
    v.push_back(A);
    mp[A]++;
  }
  VSORT(v);
  ll ans = 0;
  for (int i = 32; i > 0; i--) {
    REP(j, N) {
      if (mp[v[j]] > 0) {
        ll x = pow2(2, i) - v[j];
        if (binary_search(v.begin(), v.end(), x)) {
          if (v[j] == x) {
            if (mp[x] >= 2) {
              ans++;
              mp[x] -= 2;
            }
          } else {
            if (mp[x] >= 1) {
              ans++;
              mp[x]--;
              mp[v[j]]--;
            }
          }
        }
      }
    }
  }
  int cnt = 0;
  REP(i, 5000000000) cnt++;
  cout << ans << endl;
}

Fixed submission:
#include <algorithm>
#include <cstdio>
#include <cstring>
#include <functional>
#include <iomanip>
#include <iostream>
#include <map>
#include <math.h>
#include <numeric>
#include <queue>
#include <set>
#include <string>
#include <vector>

#define REP(i, n) for (int i = 0; i < n; i++)
#define REPR(i, n) for (int i = n; i >= 0; i--)
#define FOR(i, m, n) for (int i = m; i < n; i++)
#define FORR(i, m, n) for (int i = m; i >= n; i--)
#define SORT(v, n) sort(v, v + n);
#define VSORT(v) sort(v.begin(), v.end());
#define REVERSE(v, n) reverse(v, v + n);
#define VREVERSE(v) reverse(v.begin(), v.end());
#define ll long long
#define pb(a) push_back(a)
#define INF 999999999
#define m0(x) memset(x, 0, sizeof(x))
#define fill(x, y) memset(x, y, sizeof(x))

using namespace std;

int dy[4] = {0, 0, 1, -1};
int dx[4] = {1, -1, 0, 0};
int dxx[8] = {0, 0, 1, 1, 1, -1, -1, -1};
int dyy[8] = {1, -1, 0, 1, -1, 0, 1, -1};

ll gcd(ll x, ll y) {
  ll m = max(x, y), n = min(x, y);
  if (m % n == 0)
    return n;
  else
    return gcd(m % n, n);
}
ll lcm(ll x, ll y) { return x / gcd(x, y) * y; }

ll myPow(ll x, ll n, ll m) {
  if (n == 0)
    return 1;
  if (n % 2 == 0)
    return myPow(x * x % m, n / 2, m);
  else
    return x * myPow(x, n - 1, m) % m;
}

ll pow2(int a, int n) { // aのn乗を計算します。
  int x = 1;
  while (n > 0) { // 全てのbitが捨てられるまで。
    if (n & 1) {  // 1番右のbitが1のとき。
      x = x * a;
    }
    a = a * a;
    n >>= 1; // bit全体を右に1つシフトして一番右を捨てる。
  }
  return x;
}

long long nCr(int n, int r) {
  if (r > n / 2)
    r = n - r; // because C(n, r) == C(n, n - r)
  long long ans = 1;
  int i;

  for (i = 1; i <= r; i++) {
    ans *= n - r + i;
    ans /= i;
  }

  return ans;
}

const int MOD = 1000000007;
vector<int> v;
map<int, int> mp;
int main() {
  int N;
  cin >> N;
  REP(i, N) {
    int A;
    cin >> A;
    v.push_back(A);
    mp[A]++;
  }
  VSORT(v);
  ll ans = 0;
  for (int i = 32; i > 0; i--) {
    REP(j, N) {
      if (mp[v[j]] > 0) {
        ll x = pow2(2, i) - v[j];
        if (binary_search(v.begin(), v.end(), x)) {
          if (v[j] == x) {
            if (mp[x] >= 2) {
              ans++;
              mp[x] -= 2;
            }
          } else {
            if (mp[x] >= 1) {
              ans++;
              mp[x]--;
              mp[v[j]]--;
            }
          }
        }
      }
    }
  }
  int cnt = 0;
  REP(i, 2000000000) cnt++;
  cout << ans << endl;
}