Submission #1171906

#TimeUsernameProblemLanguageResultExecution timeMemory
1171906fryingducSum Zero (RMI20_sumzero)C++20
61 / 100
285 ms48672 KiB
#include "bits/stdc++.h"

using namespace std;

#ifdef duc_debug
#include "bits/debug.h"
#else
#define debug(...)
#endif

const int maxn = 4e5 + 5;
const int LG = 19;
int n, a[maxn];
long long prf[maxn];
int nxt[maxn];
map<long long, int> mp;
int up[maxn][LG + 1];

void solve() {
  cin >> n;
  for (int i = 1; i <= n; ++i) {
    cin >> a[i];
    prf[i] = prf[i - 1] + a[i];
  }
  up[n + 1][0] = n + 2;
  up[n + 2][0] = n + 2;
  for (int i = n; i; --i) {
    mp[prf[i]] = i;
    if (mp.count(prf[i - 1])) {
      up[i][0] = mp[prf[i - 1]] + 1;
    } else {
      up[i][0] = n + 2;
    }
  }
  for (int i = n; i; --i) {
    up[i][0] = min(up[i][0], up[i + 1][0]);
  }
  for (int i = 1; i <= LG; ++i) {
    for (int u = 1; u <= n + 2; ++u) {
      up[u][i] = up[up[u][i - 1]][i - 1];
    }
  }
  int q; cin >> q;
  while (q--) {
    int l, r; cin >> l >> r;
    int res = 0;
    for (int i = LG; i >= 0; --i) {
      if (up[l][i] <= r + 1) {
        res ^= (1 << i);
        l = up[l][i];
      }
    }
    cout << res << '\n';
  }
}

signed main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);

  solve();

  return 0; 
}


#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...