Problem p02647 (C++) — buggy submission, verdict: Time Limit Exceeded

#include <bits/stdc++.h>
#define int long long
typedef long long ll;
using namespace std;

template <typename T> struct BIT {
  int n;            // 要素数
  vector<T> bit[2]; // データの格納先
  BIT(int n_) { init(n_); }
  void init(int n_) {
    n = n_ + 1;
    for (int p = 0; p < 2; p++)
      bit[p].assign(n, 0);
  }

  void add_sub(int p, int i, T x) {
    for (int idx = i; idx < n; idx += (idx & -idx)) {
      bit[p][idx] += x;
    }
  }
  void add(int l, int r, T x) { // [l,r) に加算
    add_sub(0, l, -x * (l - 1));
    add_sub(0, r, x * (r - 1));
    add_sub(1, l, x);
    add_sub(1, r, -x);
  }

  T sum_sub(int p, int i) {
    T s(0);
    for (int idx = i; idx > 0; idx -= (idx & -idx)) {
      s += bit[p][idx];
    }
    return s;
  }
  T sum(int i) { return sum_sub(0, i) + sum_sub(1, i) * i; }
};

const ll MAXN = 200000;
const ll INF = 1001001001;

signed main() {
  ll N, K, ans = 0, tmp = 0;
  cin >> N >> K;
  vector<ll> A(N, 0);
  for (int i = 0; i < N; i++) {
    cin >> A[i];
  }
  for (int i = 0; i < min(K, 50LL); i++) {
    BIT<ll> bit(200001);
    // cout << "aioueaonvaoe" << endl;
    for (int i1 = 0; i1 < N; i1++) {
      bit.add(max(i1 + 1 - A[i1], 1LL), 1 + min(i1 + 1 + A[i1], N), 1);
    }
    /*
    for(int i2=0;i2<N+1;i2++) {
        cout << bit.sum(i2) << endl;
    }
    */

    for (int i2 = 0; i2 < N; i2++) {
      A[i2] = bit.sum(i2 + 1) - bit.sum(i2);
      if (i == min(K, 50LL) - 1) {
        if (i2)
          cout << " ";
        cout << A[i2];
      }
    }
  }
  /*
  for(int i=0;i<N;i++) {
      if(i) cout << " ";
      else cout << A[i];
  }
  */

  return 0;
}


Error: TLE

Fixed submission:

#include <bits/stdc++.h>
#define int long long
typedef long long ll;
using namespace std;

template <typename T> struct BIT {
  int n;            // 要素数
  vector<T> bit[2]; // データの格納先
  BIT(int n_) { init(n_); }
  void init(int n_) {
    n = n_ + 1;
    for (int p = 0; p < 2; p++)
      bit[p].assign(n, 0);
  }

  void add_sub(int p, int i, T x) {
    for (int idx = i; idx < n; idx += (idx & -idx)) {
      bit[p][idx] += x;
    }
  }
  void add(int l, int r, T x) { // [l,r) に加算
    add_sub(0, l, -x * (l - 1));
    add_sub(0, r, x * (r - 1));
    add_sub(1, l, x);
    add_sub(1, r, -x);
  }

  T sum_sub(int p, int i) {
    T s(0);
    for (int idx = i; idx > 0; idx -= (idx & -idx)) {
      s += bit[p][idx];
    }
    return s;
  }
  T sum(int i) { return sum_sub(0, i) + sum_sub(1, i) * i; }
};

const ll MAXN = 200000;
const ll INF = 1001001001;

signed main() {
  ll N, K, ans = 0, tmp = 0;
  cin >> N >> K;
  vector<ll> A(N, 0);
  for (int i = 0; i < N; i++) {
    cin >> A[i];
  }
  for (int i = 0; i < min(K, 100LL); i++) {
    BIT<int> bit(200001);
    // cout << "aioueaonvaoe" << endl;
    for (int i1 = 0; i1 < N; i1++) {
      bit.add(max(i1 + 1 - A[i1], 1LL), 1 + min(i1 + 1 + A[i1], N), 1);
    }

    for (int i2 = 0; i2 < N; i2++) {
      A[i2] = bit.sum(i2 + 1) - bit.sum(i2);
      if (i == min(K, 100LL) - 1) {
        if (i2)
          cout << " ";
        cout << A[i2];
      }
    }
  }
  /*
  for(int i=0;i<N;i++) {
      if(i) cout << " ";
      else cout << A[i];
  }
  */

  return 0;
}