Submission #942981

#TimeUsernameProblemLanguageResultExecution timeMemory
942981vjudge1Sum Zero (RMI20_sumzero)C++17
22 / 100
1058 ms2436 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;
    }
  }

  vals.clear();
  vals.shrink_to_fit();

  struct Node {
    int d, j, p;
  };
  
  std::vector<Node> t(n + 2);
  t[n + 1] = {0, n + 1, -1};
  
  for (int i = n, p = n + 1; i >= 0; i--) {
    p = std::min(p, R[i]);
    t[i].p = p;
    t[i].d = t[p].d;
    int p2 = t[p].j;
    if (t[p].d - t[p2].d == t[p2].d - t[t[p2].j].d) {
      t[i].j = t[p2].j;
    } else {
      t[i].j = p;
    }
  }

  int Q;
  std::cin >> Q;
  while (Q--) {
    int l, r;
    std::cin >> l >> r;
    l--;

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