Problem p02673 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double ld;
#define mp make_pair
#define PI pair<ll, ll>
#define poly vector<ll>
#define mem(a) memset((a), 0, sizeof(a))
#define For(i, l, r) for (int i = (int)(l); i <= (int)(r); i++)
#define Rep(i, r, l) for (int i = (int)(r); i >= (int)(l); i--)
#define pb push_back
#define fi first
#define se second
#define SZ(x) ((int)(x.size()))
inline char gc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
#define gc getchar
inline ll read() {
  ll x = 0;
  char ch = gc();
  bool positive = 1;
  for (; !isdigit(ch); ch = gc())
    if (ch == '-')
      positive = 0;
  for (; isdigit(ch); ch = gc())
    x = x * 10 + ch - '0';
  return positive ? x : -x;
}
inline void write(ll a) {
  if (a < 0) {
    a = -a;
    putchar('-');
  }
  if (a >= 10)
    write(a / 10);
  putchar('0' + a % 10);
}
inline void writeln(ll a) {
  write(a);
  puts("");
}
inline void wri(ll a) {
  write(a);
  putchar(' ');
}
ll rnd() {
  ull ans = 0;
  For(i, 0, 4) ans = ans << 15 ^ rand();
  return ans % ((ull)1 << 63);
}
const int N = 100005;
ld a[N], b[N], A[N], B[N], c[N], ans;
int q[N];
ld xie(int x, int y) { return (a[y] - a[x]) / (y - x); }
int main() {
#ifdef Brollan
  freopen("1.in", "r", stdin);
#endif
  int n = read();
  int p = 0;
  For(i, 1, n) {
    a[i] = read();
    if (a[i] >= a[p])
      p = i;
  }
  For(i, 1, n) b[i] = -read();
  For(i, 0, n - p) {
    A[i] = a[i + p];
    B[i] = b[i + p];
  }
  For(i, n - p + 1, n) {
    A[i] = a[i + p - n];
    B[i] = b[i + p - n];
  }
  c[0] = c[1] = 0;
  For(i, 2, n) c[i] = 2 * (c[i - 1] - B[i - 1]) - c[i - 2];
  For(i, 0, n) { a[i] = A[i] - c[i]; }
  int top = 0;
  For(i, 0, n) {
    while (top >= 2 && xie(q[top - 1], q[top]) < xie(q[top], i))
      top--;
    q[++top] = i;
  }
  For(i, 1, top - 1) {
    For(j, q[i], q[i + 1] - 1) ans +=
        c[j] + ((j - q[i]) * a[q[i + 1]] + (q[i + 1] - j) * a[q[i]]) /
                   (q[i + 1] - q[i]);
  }
  printf("%.10f\n", ans / n);
}


Fixed submission:
#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef unsigned long long ull;
typedef double ld;
#define mp make_pair
#define PI pair<ll, ll>
#define poly vector<ll>
#define mem(a) memset((a), 0, sizeof(a))
#define For(i, l, r) for (int i = (int)(l); i <= (int)(r); i++)
#define Rep(i, r, l) for (int i = (int)(r); i >= (int)(l); i--)
#define pb push_back
#define fi first
#define se second
#define SZ(x) ((int)(x.size()))
inline char gc() {
  static char buf[100000], *p1 = buf, *p2 = buf;
  return p1 == p2 && (p2 = (p1 = buf) + fread(buf, 1, 100000, stdin), p1 == p2)
             ? EOF
             : *p1++;
}
#define gc getchar
inline ll read() {
  ll x = 0;
  char ch = gc();
  bool positive = 1;
  for (; !isdigit(ch); ch = gc())
    if (ch == '-')
      positive = 0;
  for (; isdigit(ch); ch = gc())
    x = x * 10 + ch - '0';
  return positive ? x : -x;
}
inline void write(ll a) {
  if (a < 0) {
    a = -a;
    putchar('-');
  }
  if (a >= 10)
    write(a / 10);
  putchar('0' + a % 10);
}
inline void writeln(ll a) {
  write(a);
  puts("");
}
inline void wri(ll a) {
  write(a);
  putchar(' ');
}
ll rnd() {
  ull ans = 0;
  For(i, 0, 4) ans = ans << 15 ^ rand();
  return ans % ((ull)1 << 63);
}
const int N = 200005;
ld a[N], b[N], A[N], B[N], c[N], ans;
int q[N];
ld xie(int x, int y) { return (a[y] - a[x]) / (y - x); }
int main() {
#ifdef Brollan
  freopen("1.in", "r", stdin);
#endif
  int n = read();
  int p = 0;
  For(i, 1, n) {
    a[i] = read();
    if (a[i] >= a[p])
      p = i;
  }
  For(i, 1, n) b[i] = -read();
  For(i, 0, n - p) {
    A[i] = a[i + p];
    B[i] = b[i + p];
  }
  For(i, n - p + 1, n) {
    A[i] = a[i + p - n];
    B[i] = b[i + p - n];
  }
  c[0] = c[1] = 0;
  For(i, 2, n) c[i] = 2 * (c[i - 1] - B[i - 1]) - c[i - 2];
  For(i, 0, n) { a[i] = A[i] - c[i]; }
  int top = 0;
  For(i, 0, n) {
    while (top >= 2 && xie(q[top - 1], q[top]) < xie(q[top], i))
      top--;
    q[++top] = i;
  }
  For(i, 1, top - 1) {
    For(j, q[i], q[i + 1] - 1) ans +=
        c[j] + ((j - q[i]) * a[q[i + 1]] + (q[i + 1] - j) * a[q[i]]) /
                   (q[i + 1] - q[i]);
  }
  printf("%.10f\n", ans / n);
}