Submission #942997

#TimeUsernameProblemLanguageResultExecution timeMemory
942997vjudge1Sum Zero (RMI20_sumzero)C++17
100 / 100
253 ms15860 KiB
#include <bits/stdc++.h>

#define nl '\n'

#ifdef LOCAL
#include "template\debug.hpp"
#else
#define dbg(...) ;
#define timer(...) ;
#endif

signed main() {
  std::ios::sync_with_stdio(false);
  std::cin.tie(nullptr);
  int n;
  std::cin >> n;
  std::vector<std::pair<int64_t, int>> vals(n + 1);
  vals[0] = {0, 0};
  int64_t sum = 0;
  for (int i = 1; i <= n; i++) {
    int x;
    std::cin >> x;
    sum += x;
    vals[i] = {sum, i};
  }

  std::sort(vals.begin(), vals.end());
  std::vector<int> R(n + 1);
  
  for (int i = 0; i <= n; i++) {
    int j = i;
    while (j <= n && vals[i].first == vals[j].first) {
      j++;
    }
    
    // now we talking
    R[vals[j - 1].second] = n + 1;
    for (int k = j - 2; k >= i; k--) {
      R[vals[k].second] = vals[k + 1].second;
    }
    i = j - 1;
  }

  vals.clear();
  vals.shrink_to_fit();
  
  std::vector<int> jump(n + 2), depth(n + 2), parent(n + 2);
  jump[n + 1] = n + 1;
  
  for (int i = n, to = n + 1; i >= 0; i--) {
    to = std::min(to, R[i]);
    parent[i] = to;
    depth[i] = depth[parent[i]] + 1;
    if (depth[parent[i]] - depth[jump[parent[i]]] == depth[jump[parent[i]]] - depth[jump[jump[parent[i]]]]) {
      jump[i] = jump[jump[parent[i]]];
    } else {
      jump[i] = parent[i];
    }
  }
  
  int Q;
  std::cin >> Q;
  while (Q--) {
    int l, r;
    std::cin >> l >> r;
    l--;

    int counter = 0;
    int u = l;
    while (parent[u] <= r) {
      if (jump[u] <= r) {
        counter += depth[u] - depth[jump[u]];
        u = jump[u];
      } else {
        counter++;
        u = parent[u];
      }
    }
    
    std::cout << counter << nl;
  }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...