Submission #1263408

#TimeUsernameProblemLanguageResultExecution timeMemory
1263408mine255Sum Zero (RMI20_sumzero)C++20
61 / 100
304 ms58036 KiB
#include <bits/stdc++.h>
#define _FILE "TEMP"
#define ll long long
#define ii pair<ll,ll>
#define fi first
#define se second
#define MASK(i) (1ll << (i))
#define BIT(x, i) (((x) >> (i)) & 1)
using namespace std;

int n;
ll pre[400007];
map<ll,int> mp;
int up[400007][27];

int main() {

  ios_base::sync_with_stdio(0);
  cin.tie(nullptr); cout.tie(nullptr);

  #ifdef EMERGENCY_DEBUG
  freopen(_FILE".inp","r",stdin);
  freopen(_FILE".out","w",stdout);
  #endif

  cin >> n;
  for (int i=1; i<=n; i++) {
    cin >> pre[i];
    pre[i] += pre[i-1];
  }

  up[n+1][0] = INT_MAX;
  for (int i=n; i>0; i--) {
    up[i][0] = INT_MAX;
    mp[pre[i]] = i;

    auto it = mp.find(pre[i-1]);
    if (it != mp.end()) up[i][0] = it->second+1;

    up[i][0] = min(up[i][0],up[i+1][0]);
  }

  for (int j=1; j<=20; j++) {
    for (int i=1; i<=n+1; i++) {
      if (up[i][j-1] == INT_MAX || up[up[i][j-1]][j-1] == INT_MAX) up[i][j] = INT_MAX;
      else up[i][j] = up[up[i][j-1]][j-1];
    }
  }

  int q;
  cin >> q;

  while (q--) {
    int l,r;
    cin >> l >> r;

    ll res = 0;
    for (int i=__lg(r-l+1)+1; i>=0; i--) {
      if (up[l][i] > r+1) continue;
      // cerr << l << ' ' << i << '\n';
      res += MASK(i);
      l = up[l][i];
    }

    cout << res << '\n';
  }

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...