Problem p02609 (C++)

Buggy submission (status: Runtime Error):
#include <bits/stdc++.h>
/*#ifndef M_PI
    #define M_PI 3.14159265358979323846
#endif
*/

using namespace std;
#define m 1000000001
#define rep(i, a, b) for (int i = a; i < b; ++i)
#define repb(i, a, b) for (int i = a; i >= b; --i)
#define repv(arr) for (auto it = arr[i].begin(); it != arr[i].end(); ++it)
#define vi vector<int>
#define vb vector<bool>
#define vs vector<string>
#define vl vector<long long int>
#define ssortA(arr) stable_sort(arr.begin(), arr.end())
#define search(arr, c) binary_search(arr.begin(), arr.end(), c)
#define pb push_back
#define ll long long
#define mp make_pair
#define LCM(a, b) boost::math::lcm(a, b)
#define cl_bf cin.ignore(numeric_limits<streamsize>::max(), '\n');
int step(int a) {
  if (a == 0) {
    return 0;
  } else {
    int count = 0;
    while (a != 0) {
      a = a % __builtin_popcount(a);
      count++;
    }
    return count;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  vector<char> arr(n);
  vi i1, i2;
  int c = 0;
  rep(i, 0, n) {
    cin >> arr[i];
    if (arr[i] == '1')
      ++c;
  }
  // cout<<c<<endl;
  int x = c - 1;
  if (x < 0) {
    rep(i, 0, n) {
      if (arr[i] == '0')
        cout << 1 << endl;
      else {
        cout << 0 << endl;
      }
    }
    return 0;
  }
  if (x == 0) {
    rep(i, 0, n) {
      if (arr[i] == '1')
        cout << 0 << endl;
      else {
        if (arr[n - 1] == '1')
          cout << 2 << endl;
        else {
          if (i == n - 1)
            cout << 2 << endl;
          else {
            cout << 1 << endl;
          }
        }
      }
    }
  }
  int y = c + 1;
  vi b(200001, 0);
  rep(i, 1, 200001) {
    int j = i;
    int c1 = 0;
    while (j != 0) {
      if (j % 2 != 0)
        ++c1;
      j /= 2;
    }
    b[i] = 1 + b[i % c1];
    /*if(i<=100){
        cout<<b[i]<<endl;
    }*/

    /*if(i>199900){
    cout<<b[i]<<" ";
    }*/
  }
  // cout<<endl;
  // cout<<b[15]<<endl;
  vi p1(n), p2(n);
  p1[0] = 1 % x;
  for (int i = 1; i < n; i++) {
    p1[i] = p1[i - 1] * (2 % x);
    p1[i] %= x;
    // cout<<p1[i]<<" ";
  }
  // cout<<endl;
  p2[0] = 1 % y;
  for (int i = 1; i < n; i++) {
    p2[i] = p2[i - 1] * (2 % y);
    p2[i] %= y;
  }
  ll sum1 = 0, sum2 = 0;
  rep(i, 0, n) {
    if (arr[i] == '1') {
      sum1 += p1[n - 1 - i];
      sum1 = sum1 % x;
    }
  }
  rep(i, 0, n) {
    if (arr[i] == '1') {
      sum2 += p2[n - 1 - i];
      sum2 = sum2 % y;
    }
  }
  rep(i, 0, n) {
    if (arr[i] == '1') {
      int g = sum1;
      int e = p1[n - 1 - i] % x;
      // cout<<e<<" "<<sum1<<endl;
      g = (sum1 - e + x) % x;
      int f = 1 + step(g);
      cout << f << endl;
    } else {
      int g = sum2;
      int e = p2[n - 1 - i] % y;
      g = (sum2 + e + y) % y;
      int f = 1 + step(g);
      cout << f << endl;
    }
  }
  // cout<<"hi"<<endl;
}


Fixed submission:
#include <bits/stdc++.h>
/*#ifndef M_PI
    #define M_PI 3.14159265358979323846
#endif
*/

using namespace std;
#define m 1000000001
#define rep(i, a, b) for (int i = a; i < b; ++i)
#define repb(i, a, b) for (int i = a; i >= b; --i)
#define repv(arr) for (auto it = arr[i].begin(); it != arr[i].end(); ++it)
#define vi vector<int>
#define vb vector<bool>
#define vs vector<string>
#define vl vector<long long int>
#define ssortA(arr) stable_sort(arr.begin(), arr.end())
#define search(arr, c) binary_search(arr.begin(), arr.end(), c)
#define pb push_back
#define ll long long
#define mp make_pair
#define LCM(a, b) boost::math::lcm(a, b)
#define cl_bf cin.ignore(numeric_limits<streamsize>::max(), '\n');
int step(int a) {
  if (a == 0) {
    return 0;
  } else {
    int count = 0;
    while (a != 0) {
      a = a % __builtin_popcount(a);
      count++;
    }
    return count;
  }
}
int main() {
  ios_base::sync_with_stdio(false);
  cin.tie(0);
  cout.tie(0);
  int n;
  cin >> n;
  vector<char> arr(n);
  vi i1, i2;
  int c = 0;
  rep(i, 0, n) {
    cin >> arr[i];
    if (arr[i] == '1')
      ++c;
  }
  // cout<<c<<endl;
  int x = c - 1;
  if (x < 0) {
    rep(i, 0, n) {
      if (arr[i] == '0')
        cout << 1 << endl;
      else {
        cout << 0 << endl;
      }
    }
    return 0;
  }
  if (x == 0) {
    rep(i, 0, n) {
      if (arr[i] == '1')
        cout << 0 << endl;
      else {
        if (arr[n - 1] == '1')
          cout << 2 << endl;
        else {
          if (i == n - 1)
            cout << 2 << endl;
          else {
            cout << 1 << endl;
          }
        }
      }
    }
    return 0;
  }
  int y = c + 1;
  vi b(200001, 0);
  rep(i, 1, 200001) {
    int j = i;
    int c1 = 0;
    while (j != 0) {
      if (j % 2 != 0)
        ++c1;
      j /= 2;
    }
    b[i] = 1 + b[i % c1];
    /*if(i<=100){
        cout<<b[i]<<endl;
    }*/

    /*if(i>199900){
    cout<<b[i]<<" ";
    }*/
  }
  // cout<<endl;
  // cout<<b[15]<<endl;
  vi p1(n), p2(n);
  p1[0] = 1 % x;
  for (int i = 1; i < n; i++) {
    p1[i] = p1[i - 1] * (2 % x);
    p1[i] %= x;
    // cout<<p1[i]<<" ";
  }
  // cout<<endl;
  p2[0] = 1 % y;
  for (int i = 1; i < n; i++) {
    p2[i] = p2[i - 1] * (2 % y);
    p2[i] %= y;
  }
  ll sum1 = 0, sum2 = 0;
  rep(i, 0, n) {
    if (arr[i] == '1') {
      sum1 += p1[n - 1 - i];
      sum1 = sum1 % x;
    }
  }
  rep(i, 0, n) {
    if (arr[i] == '1') {
      sum2 += p2[n - 1 - i];
      sum2 = sum2 % y;
    }
  }
  rep(i, 0, n) {
    if (arr[i] == '1') {
      int g = sum1;
      int e = p1[n - 1 - i] % x;
      // cout<<e<<" "<<sum1<<endl;
      g = (sum1 - e + x) % x;
      int f = 1 + step(g);
      cout << f << endl;
    } else {
      int g = sum2;
      int e = p2[n - 1 - i] % y;
      g = (sum2 + e + y) % y;
      int f = 1 + step(g);
      cout << f << endl;
    }
  }
  // cout<<"hi"<<endl;
}