Problem p02904 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>

#define fi first
#define se second

const int N = 200200;
const long long m1 = 999998727899999ll;
const long long m2 = 777737777777777ll;
const long long p1 = 1e9 + 7;
const long long p2 = 1e9 + 9;

using namespace std;

struct fenwick {
  long long mod;
  long long t[N];

  void upd(int x, long long y) {
    y %= mod;
    while (x < N) {
      t[x] += y;
      if (t[x] < 0) {
        t[x] += mod;
      } else if (t[x] >= mod) {
        t[x] -= mod;
      }
      x += x & -x;
    }
  }
  long long get(int x) {
    long long res = 0;
    while (x > 0) {
      res += t[x];
      if (res >= mod) {
        res -= mod;
      }
      x -= x & -x;
    }
    return res;
  }
};

fenwick t1, t2;
fenwick C;

int n;
int k;
int a[N];
long long f1[N];
long long f2[N];

long long safe_mul(long long x, long long y, long long mod) {
  x %= mod;

  long long res = 0;
  while (y) {
    if (y & 1) {
      res += x;
      if (res >= mod) {
        res -= mod;
      }
    }
    y /= 2;
    x += x;
    if (x >= mod) {
      x -= mod;
    }
  }
  return res;
}

void add(long long &x, long long y, const long long &mod) {
  x += y;
  if (x < 0) {
    x += mod;
  } else if (x >= mod) {
    x -= mod;
  }
}

int main() {
  freopen("input.txt", "r", stdin);
  freopen("output.txt", "w", stdout);
  ios_base::sync_with_stdio(0);

  t1.mod = m1;
  t2.mod = m2;
  C.mod = N;

  cin >> n >> k;
  f1[0] = f2[0] = 1;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    a[i] += 1;

    f1[i] = safe_mul(f1[i - 1], p1, m1);
    f2[i] = safe_mul(f2[i - 1], p2, m2);
  }
  set<pair<long long, long long>> res;

  long long A = 0, B = 0;
  for (int i = 1; i < k; i++) {
    t1.upd(a[i], f1[i]);
    t2.upd(a[i], f2[i]);
    C.upd(a[i], 1);

    add(A, t1.get(n), m1);
    add(A, -t1.get(a[i]), m1);
    add(B, t2.get(n), m2);
    add(B, -t2.get(a[i]), m2);
  }
  for (int i = k; i <= n; i++) {
    t1.upd(a[i], f1[i]);
    t2.upd(a[i], f2[i]);
    C.upd(a[i], 1);

    add(A, t1.get(n), m1);
    add(A, -t1.get(a[i]), m1);
    add(B, t2.get(n), m2);
    add(B, -t2.get(a[i]), m2);

    // cout << A << " " << B << endl;
    res.insert({A, B});

    long long col = C.get(a[i - k + 1] - 1);
    t1.upd(a[i - k + 1], -f1[i - k + 1]);
    t2.upd(a[i - k + 1], -f2[i - k + 1]);
    C.upd(a[i - k + 1], -1);

    add(A, -safe_mul(col, f1[i - k + 1], m1), m1);
    add(B, -safe_mul(col, f2[i - k + 1], m2), m2);
  }

  cout << res.size() << "\n";
}


Fixed submission:
#include <bits/stdc++.h>

#define fi first
#define se second

const int N = 200200;
const long long m1 = 999998727899999ll;
const long long m2 = 777737777777777ll;
const long long p1 = 1e9 + 7;
const long long p2 = 1e9 + 9;

using namespace std;

struct fenwick {
  long long mod;
  long long t[N];

  void upd(int x, long long y) {
    y %= mod;
    while (x < N) {
      t[x] += y;
      if (t[x] < 0) {
        t[x] += mod;
      } else if (t[x] >= mod) {
        t[x] -= mod;
      }
      x += x & -x;
    }
  }
  long long get(int x) {
    long long res = 0;
    while (x > 0) {
      res += t[x];
      if (res >= mod) {
        res -= mod;
      }
      x -= x & -x;
    }
    return res;
  }
};

fenwick t1, t2;
fenwick C;

int n;
int k;
int a[N];
long long f1[N];
long long f2[N];

long long safe_mul(long long x, long long y, long long mod) {
  x %= mod;

  long long res = 0;
  while (y) {
    if (y & 1) {
      res += x;
      if (res >= mod) {
        res -= mod;
      }
    }
    y /= 2;
    x += x;
    if (x >= mod) {
      x -= mod;
    }
  }
  return res;
}

void add(long long &x, long long y, const long long &mod) {
  x += y;
  if (x < 0) {
    x += mod;
  } else if (x >= mod) {
    x -= mod;
  }
}

int main() {
  // freopen("input.txt", "r", stdin);
  // freopen("output.txt", "w", stdout);
  ios_base::sync_with_stdio(0);

  t1.mod = m1;
  t2.mod = m2;
  C.mod = N;

  cin >> n >> k;
  f1[0] = f2[0] = 1;
  for (int i = 1; i <= n; i++) {
    cin >> a[i];
    a[i] += 1;

    f1[i] = safe_mul(f1[i - 1], p1, m1);
    f2[i] = safe_mul(f2[i - 1], p2, m2);
  }
  set<pair<long long, long long>> res;

  long long A = 0, B = 0;
  for (int i = 1; i < k; i++) {
    t1.upd(a[i], f1[i]);
    t2.upd(a[i], f2[i]);
    C.upd(a[i], 1);

    add(A, t1.get(n), m1);
    add(A, -t1.get(a[i]), m1);
    add(B, t2.get(n), m2);
    add(B, -t2.get(a[i]), m2);
  }
  for (int i = k; i <= n; i++) {
    t1.upd(a[i], f1[i]);
    t2.upd(a[i], f2[i]);
    C.upd(a[i], 1);

    add(A, t1.get(n), m1);
    add(A, -t1.get(a[i]), m1);
    add(B, t2.get(n), m2);
    add(B, -t2.get(a[i]), m2);

    // cout << A << " " << B << endl;
    res.insert({A, B});

    long long col = C.get(a[i - k + 1] - 1);
    t1.upd(a[i - k + 1], -f1[i - k + 1]);
    t2.upd(a[i - k + 1], -f2[i - k + 1]);
    C.upd(a[i - k + 1], -1);

    add(A, -safe_mul(col, f1[i - k + 1], m1), m1);
    add(B, -safe_mul(col, f2[i - k + 1], m2), m2);
  }

  cout << res.size() << "\n";
}