Problem p02588 (C++) — buggy submission, verdict: Runtime Error

// Code By CXY07
#include <bits/stdc++.h>
using namespace std;

// #define FILE
#define int long long
// #define LL long long
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fst first
#define scd second
#define inv(x) ksm(x, mod - 2)
#define lowbit(x) (x & (-x))

const int MAXN = 2e5 + 10;
const int INF = 2e9;
const double PI = acos(-1);
// const double mul = 1e10;
// const int mod = 1e9 + 7;
// const int mod = 998244353;
// const int G = 3;

int n, a[MAXN], ans;
int two[MAXN], five[MAXN];
int p[110][110], sum[110][110];
char s[20];

template <typename T> inline void read(T &a) {
  a = 0;
  char c = getchar();
  int f = 1;
  while (c < '0' || c > '9') {
    if (c == '-')
      f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    a = a * 10 + (c ^ 48);
    c = getchar();
  }
  a *= f;
}

int calc(int x, int y) {
  x++, y++;
  x = max(x, 1ll), y = max(y, 1ll);
  return sum[100][100] - sum[x - 1][100] - sum[100][y - 1] + sum[x - 1][y - 1];
}

signed main() {
#ifdef FILE
  freopen(".in", "r", stdin);
  freopen(".out", "w", stdout);
#endif
  read(n);
  for (int i = 1; i <= n; ++i) {
    scanf("%s", s + 1);
    int lim = strlen(s + 1), flag = false, cnt = 10;
    for (int j = 1; j <= lim; ++j) {
      if (s[j] == '.') {
        flag = true;
        continue;
      }
      a[i] *= 10;
      a[i] += (s[j] - '0');
      if (flag)
        cnt--;
    }
    for (int j = 1; j <= cnt; ++j)
      a[i] *= 10;
    while (a[i] % 2 == 0)
      two[i]++, a[i] /= 2;
    while (a[i] % 5 == 0)
      five[i]++, a[i] /= 5;
    p[two[i] + 1][five[i] + 1]++;
  }
  for (int i = 1; i <= 100; ++i)
    for (int j = 1; j <= 100; ++j)
      sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + p[i][j];
  for (int i = 1; i <= n; ++i) {
    ans += calc(20 - two[i], 20 - five[i]);
    if (20 - two[i] <= two[i] && 20 - five[i] <= five[i])
      ans--;
  }
  printf("%lld\\n", ans / 2);
  return 0;
}


Error: 0

Fixed submission:

// Code By CXY07
#include <bits/stdc++.h>
using namespace std;

// #define FILE
#define int long long
// #define LL long long
#define pii pair<int, int>
#define mp make_pair
#define pb push_back
#define fst first
#define scd second
#define inv(x) ksm(x, mod - 2)
#define lowbit(x) (x & (-x))

const int MAXN = 2e5 + 10;
const int INF = 2e9;
const double PI = acos(-1);
const double mul = 1e9;
// const int mod = 1e9 + 7;
// const int mod = 998244353;
// const int G = 3;

int n, a[MAXN], ans;
int two[MAXN], five[MAXN];
int p[110][110], sum[110][110];
double tmp;

template <typename T> inline void read(T &a) {
  a = 0;
  char c = getchar();
  int f = 1;
  while (c < '0' || c > '9') {
    if (c == '-')
      f = -1;
    c = getchar();
  }
  while (c >= '0' && c <= '9') {
    a = a * 10 + (c ^ 48);
    c = getchar();
  }
  a *= f;
}

int calc(int x, int y) {
  x++, y++;
  return sum[100][100] - sum[x - 1][100] - sum[100][y - 1] + sum[x - 1][y - 1];
}

signed main() {
#ifdef FILE
  freopen(".in", "r", stdin);
  freopen(".out", "w", stdout);
#endif
  read(n);
  for (int i = 1; i <= n; ++i) {
    scanf("%lf", &tmp);
    a[i] = tmp * mul;
    while (a[i] % 2 == 0)
      two[i]++, a[i] /= 2;
    while (a[i] % 5 == 0)
      five[i]++, a[i] /= 5;
    p[two[i] + 1][five[i] + 1]++;
  }
  for (int i = 1; i <= 100; ++i)
    for (int j = 1; j <= 100; ++j)
      sum[i][j] = sum[i - 1][j] + sum[i][j - 1] - sum[i - 1][j - 1] + p[i][j];
  for (int i = 1; i <= n; ++i) {
    ans += calc(18 - two[i], 18 - five[i]);
    if (18 - two[i] <= two[i] && 18 - five[i] <= five[i])
      ans--;
  }
  printf("%lld\\n", ans / 2);
  return 0;
}