Problem p02941 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define R cin >>
#define Z class
#define ll long long
#define ln cout << '\n'
#define in(a) insert(a)
#define pb(a) push_back(a)
#define pd(a) printf("%.10f\n", a)
#define mem(a) memset(a, 0, sizeof(a))
#define all(c) (c).begin(), (c).end()
#define iter(c) __typeof((c).begin())
#define rrep(i, n) for (ll i = (ll)(n)-1; i >= 0; i--)
#define REP(i, m, n) for (ll i = (ll)(m); i < (ll)(n); i++)
#define rep(i, n) REP(i, 0, n)
#define tr(it, c) for (iter(c) it = (c).begin(); it != (c).end(); it++)
template <Z A> void pr(A a) {
  cout << a;
  ln;
}
template <Z A, Z B> void pr(A a, B b) {
  cout << a << ' ';
  pr(b);
}
template <Z A, Z B, Z C> void pr(A a, B b, C c) {
  cout << a << ' ';
  pr(b, c);
}
template <Z A, Z B, Z C, Z D> void pr(A a, B b, C c, D d) {
  cout << a << ' ';
  pr(b, c, d);
}
template <Z A> void PR(A a, ll n) {
  rep(i, n) {
    if (i)
      cout << ' ';
    cout << a[i];
  }
  ln;
}
ll check(ll n, ll m, ll x, ll y) { return x >= 0 && x < n && y >= 0 && y < m; }
const ll MAX = 1e9 + 7, MAXL = 1LL << 61, dx[4] = {-1, 0, 1, 0},
         dy[4] = {0, 1, 0, -1};
typedef pair<ll, ll> P;

void Main() {
  ll n;
  R n;
  ll a[n], b[n];
  rep(i, n) R a[i];
  rep(i, n) R b[i];
  priority_queue<P> que;
  que.push(P(0, -1));
  rep(i, n) if (b[i] > a[i]) que.push(P(b[i], i));
  ll ans = 0;
  while (que.size() > 1) {
    P p = que.top();
    que.pop();
    ll x = p.S;
    P q = que.top();
    ll z = b[(x - 1 + n) % n] + b[(x + 1) % n];
    ll m = max(1LL, min((b[x] - a[x]) / z, (ll)ceil((double)(b[x] - q.F) / z)));
    b[x] -= m * z;
    ans += m;
    if (b[x] < a[x]) {
      pr(-1);
      return;
    }
    if (b[x] > a[x])
      que.push(P(b[x], x));
  }
  pr(ans);
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  Main();
  return 0;
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
#define F first
#define S second
#define R cin >>
#define Z class
#define ll long long
#define ln cout << '\n'
#define in(a) insert(a)
#define pb(a) push_back(a)
#define pd(a) printf("%.10f\n", a)
#define mem(a) memset(a, 0, sizeof(a))
#define all(c) (c).begin(), (c).end()
#define iter(c) __typeof((c).begin())
#define rrep(i, n) for (ll i = (ll)(n)-1; i >= 0; i--)
#define REP(i, m, n) for (ll i = (ll)(m); i < (ll)(n); i++)
#define rep(i, n) REP(i, 0, n)
#define tr(it, c) for (iter(c) it = (c).begin(); it != (c).end(); it++)
template <Z A> void pr(A a) {
  cout << a;
  ln;
}
template <Z A, Z B> void pr(A a, B b) {
  cout << a << ' ';
  pr(b);
}
template <Z A, Z B, Z C> void pr(A a, B b, C c) {
  cout << a << ' ';
  pr(b, c);
}
template <Z A, Z B, Z C, Z D> void pr(A a, B b, C c, D d) {
  cout << a << ' ';
  pr(b, c, d);
}
template <Z A> void PR(A a, ll n) {
  rep(i, n) {
    if (i)
      cout << ' ';
    cout << a[i];
  }
  ln;
}
ll check(ll n, ll m, ll x, ll y) { return x >= 0 && x < n && y >= 0 && y < m; }
const ll MAX = 1e9 + 7, MAXL = 1LL << 61, dx[4] = {-1, 0, 1, 0},
         dy[4] = {0, 1, 0, -1};
typedef pair<ll, ll> P;

void Main() {
  ll n;
  R n;
  ll a[n], b[n];
  rep(i, n) R a[i];
  rep(i, n) R b[i];
  priority_queue<P> que;
  que.push(P(0, -1));
  rep(i, n) if (b[i] > a[i]) que.push(P(b[i], i));
  ll ans = 0;
  while (que.size() > 1) {
    P p = que.top();
    que.pop();
    ll x = p.S;
    P q = que.top();
    ll z = b[(x - 1 + n) % n] + b[(x + 1) % n];
    // ll m=max(1LL,min((b[x]-a[x])/z,(ll)ceil((double)(b[x]-q.F)/z)));
    ll m = max(1LL, (b[x] - a[x]) / z);
    b[x] -= m * z;
    ans += m;
    if (b[x] < a[x]) {
      pr(-1);
      return;
    }
    if (b[x] > a[x])
      que.push(P(b[x], x));
  }
  pr(ans);
}

int main() {
  ios::sync_with_stdio(0);
  cin.tie(0);
  Main();
  return 0;
}