Problem p03395 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
#define ALL(x) x.begin(), x.end()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define debug(v)                                                               \
  cout << #v << ":";                                                           \
  for (auto x : v) {                                                           \
    cout << x << ' ';                                                          \
  }                                                                            \
  cout << endl;
#define mod 1000000007
using ll = long long;
const int INF = 1000000000;
const ll LINF = 1001002003004005006ll;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

struct IOSetup {
  IOSetup() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(12);
  }
} iosetup;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  os << p.first << " " << p.second;
  return os;
}

template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (int i = 0; i < (int)v.size(); i++)
    os << v[i] << (i + 1 == v.size() ? "" : " ");
  return os;
}

set<ll> fill(int a, int b) {
  // k>b
  set<ll> dp[a + 1];
  dp[a].insert(0);
  for (int i = a; i > 0; i--) {
    for (auto x : dp[i]) {
      for (int j = 1; j <= i; j++) {
        dp[i % j].insert(x + (1ll << j));
      }
    }
  }
  return dp[b];
}

const int bs = 20;
void bitout(set<ll> a) {
  for (auto x : a)
    cout << bitset<bs>(x) << endl;
}

signed main() {

  int n;
  cin >> n;
  vector<int> a(n), b(n);
  rep(i, n) cin >> a[i];
  rep(i, n) cin >> b[i];

  vector<set<ll>> v;
  rep(i, n) {
    if (a[i] == 0)
      continue;
    auto res = fill(a[i], b[i]);
    // cout<<a[i]<<" "<<b[i]<<endl;
    // bitout(res);
    if (res.empty()) {
      cout << -1 << endl;
      return 0;
    }
    v.push_back(res);
  }

  n = (int)v.size();

  ll ans = 0;
  for (int b = 51; b > 0; b--) {
    bool can = true;
    rep(i, n) {
      bool f = false;
      if (v[i].empty())
        f = true;
      for (auto x : v[i]) {
        // 無くてもいいよ
        if (((x >> b) & 1) == 0)
          f = true;
      }
      if (!f)
        can = false;
    }
    if (can) {
      rep(i, n) {
        for (auto ite = v[i].begin(); ite != v[i].end();) {
          ll num = *ite;
          if ((num >> b) & 1)
            ite = v[i].erase(ite);
          else
            ite++;
        }
      }

    } else {
      ans += 1ll << b;
    }
  }
  cout << ans << endl;
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define ALL(x) x.begin(), x.end()
#define rep(i, n) for (int i = 0; i < (n); i++)
#define debug(v)                                                               \
  cout << #v << ":";                                                           \
  for (auto x : v) {                                                           \
    cout << x << ' ';                                                          \
  }                                                                            \
  cout << endl;
#define mod 1000000007
using ll = long long;
const int INF = 1000000000;
const ll LINF = 1001002003004005006ll;
int dx[] = {1, 0, -1, 0};
int dy[] = {0, 1, 0, -1};
// ll gcd(ll a,ll b){return b?gcd(b,a%b):a;}
template <class T> bool chmax(T &a, const T &b) {
  if (a < b) {
    a = b;
    return true;
  }
  return false;
}
template <class T> bool chmin(T &a, const T &b) {
  if (b < a) {
    a = b;
    return true;
  }
  return false;
}

struct IOSetup {
  IOSetup() {
    cin.tie(0);
    ios::sync_with_stdio(0);
    cout << fixed << setprecision(12);
  }
} iosetup;

template <typename T1, typename T2>
ostream &operator<<(ostream &os, const pair<T1, T2> &p) {
  os << p.first << " " << p.second;
  return os;
}

template <typename T> ostream &operator<<(ostream &os, const vector<T> &v) {
  for (int i = 0; i < (int)v.size(); i++)
    os << v[i] << (i + 1 == v.size() ? "" : " ");
  return os;
}

set<ll> fill(int a, int b) {
  if (b > a)
    return set<ll>();
  // k>b
  set<ll> dp[a + 1];
  dp[a].insert(0);
  for (int i = a; i > 0; i--) {
    for (auto x : dp[i]) {
      for (int j = 1; j <= i; j++) {
        dp[i % j].insert(x + (1ll << j));
      }
    }
  }
  return dp[b];
}

const int bs = 20;
void bitout(set<ll> a) {
  for (auto x : a)
    cout << bitset<bs>(x) << endl;
}

signed main() {

  int n;
  cin >> n;
  vector<int> a(n), b(n);
  rep(i, n) cin >> a[i];
  rep(i, n) cin >> b[i];

  vector<set<ll>> v;
  rep(i, n) {
    if (a[i] == 0)
      continue;
    auto res = fill(a[i], b[i]);
    // cout<<a[i]<<" "<<b[i]<<endl;
    // bitout(res);
    if (res.empty()) {
      cout << -1 << endl;
      return 0;
    }
    v.push_back(res);
  }

  n = (int)v.size();

  ll ans = 0;
  for (int b = 51; b > 0; b--) {
    bool can = true;
    rep(i, n) {
      bool f = false;
      if (v[i].empty())
        f = true;
      for (auto x : v[i]) {
        // 無くてもいいよ
        if (((x >> b) & 1) == 0)
          f = true;
      }
      if (!f)
        can = false;
    }
    if (can) {
      rep(i, n) {
        for (auto ite = v[i].begin(); ite != v[i].end();) {
          ll num = *ite;
          if ((num >> b) & 1)
            ite = v[i].erase(ite);
          else
            ite++;
        }
      }

    } else {
      ans += 1ll << b;
    }
  }
  cout << ans << endl;
  return 0;
}