Problem p03703 (C++)

Buggy submission (status: Runtime Error):
#include "math.h"
#include <algorithm>
#include <complex>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>
#define ifor(i, a, b) for (int i = (a); i < (b); i++)
#define rfor(i, a, b) for (int i = (b)-1; i >= (a); i--)
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for (int i = (n)-1; i >= 0; i--)
using namespace std;
using lli = long long int;
template <class T> class bit {
public:
  vector<T> dat;
  int n;

  bit(int n) : n(n) { dat.assign(n, 0); }
  bit(int n, T ini) : n(n) { dat.assign(n, ini); }
  // sum [0,i)
  T sum(int i) {
    int ret = 0;
    for (--i; i >= 0; i = (i & (i + 1)) - 1)
      ret += dat[i];
    return ret;
  }
  // sum [i,j)
  T sum(int i, int j) { return sum(j) - sum(i); }
  // add x to i
  void add(int i, T x) {
    for (; i < n; i |= i + 1)
      dat[i] += x;
  }
};
int main() {
  int n;
  lli k;
  lli a[100005];
  lli res = 0;
  cin >> n >> k;
  rep(i, n) { cin >> a[i]; }
  lli sum = 0;
  map<lli, lli> f;
  f[sum]++;
  rep(i, n) {
    sum += a[i];
    f[(i + 1) * k - sum] += 1;
  }
  int cnt = 0;
  map<lli, lli> comp;
  for (auto s : f) {
    // cout << "hash " << cnt << " " << s.first;
    comp[s.first] = cnt;
    cnt++;
  }
  bit<lli> bi(n + 10);
  bi.add(comp[0], 1);
  sum = 0;
  rep(i, n) {
    if (i == 0) {
      if (a[i] >= k) {
        res++;
      }
      sum += a[i];
      lli val = (i + 1) * k - sum;
      bi.add(comp[val], 1);
    } else if (n != 1) {
      sum += a[i];
      res += i + 1 - bi.sum(comp[(i + 1) * k - sum]);
      bi.add(comp[(i + 1) * k - sum], 1);
    }
    // cout << sum << " " << res << endl;
  }
  cout << res << endl;
}


Fixed submission:
#include "math.h"
#include <algorithm>
#include <complex>
#include <cstdio>
#include <iomanip>
#include <iostream>
#include <map>
#include <queue>
#include <set>
#include <string>
#include <vector>
#define ifor(i, a, b) for (int i = (a); i < (b); i++)
#define rfor(i, a, b) for (int i = (b)-1; i >= (a); i--)
#define rep(i, n) for (int i = 0; i < (n); i++)
#define rrep(i, n) for (int i = (n)-1; i >= 0; i--)
using namespace std;
using lli = long long int;
template <class T> class bit {
public:
  vector<T> dat;
  int n;

  bit(int n) : n(n) { dat.assign(n, 0); }
  bit(int n, T ini) : n(n) { dat.assign(n, ini); }
  // sum [0,i)
  T sum(int i) {
    int ret = 0;
    for (--i; i >= 0; i = (i & (i + 1)) - 1)
      ret += dat[i];
    return ret;
  }
  // sum [i,j)
  T sum(int i, int j) { return sum(j) - sum(i); }
  // add x to i
  void add(int i, T x) {
    for (; i < n; i |= i + 1)
      dat[i] += x;
  }
};
int main() {
  int n;
  lli k;
  lli a[200005];
  lli res = 0;
  cin >> n >> k;
  rep(i, n) { cin >> a[i]; }
  lli sum = 0;
  map<lli, lli> f;
  f[sum]++;
  rep(i, n) {
    sum += a[i];
    f[(i + 1) * k - sum] += 1;
  }
  int cnt = 0;
  map<lli, lli> comp;
  for (auto s : f) {
    // cout << "hash " << cnt << " " << s.first;
    comp[s.first] = cnt;
    cnt++;
  }
  bit<lli> bi(n + 10);
  bi.add(comp[0], 1);
  sum = 0;
  rep(i, n) {
    if (i == 0) {
      if (a[i] >= k) {
        res++;
      }
      sum += a[i];
      lli val = (i + 1) * k - sum;
      bi.add(comp[val], 1);
    } else if (n != 1) {
      sum += a[i];
      res += i + 1 - bi.sum(comp[(i + 1) * k - sum]);
      bi.add(comp[(i + 1) * k - sum], 1);
    }
    // cout << sum << " " << res << endl;
  }
  cout << res << endl;
}