제출 #1355533

#제출 시각아이디문제언어결과실행 시간메모리
1355533vjudge1Sum Zero (RMI20_sumzero)C++20
0 / 100
15 ms37956 KiB
#include<bits/stdc++.h>
using namespace std;
const int maxN = 4e5 + 5, lg = __lg(400000) / __lg(2) + 1;

int n, q, c[maxN];
int lca[maxN][lg + 5];
int sum[maxN];
int ps[maxN];
int main(){
    ios_base::sync_with_stdio(false);
    cin.tie(0);
    cin >> n;
    for (int i = 1; i <= n; i ++){
        cin >> c[i];
        sum[i] = sum[i - 1] + c[i];
    }
    map<int, int> cnt;
    ps[n + 1] = 1e9;
    memset(lca, 0x3f, sizeof(lca));
    for (int i = n; i >= 1; i --){
        cnt[sum[i]] = i;
        ps[i] = cnt[sum[i - 1]];
        if (ps[i] == 0) ps[i] = 1e9;
        ps[i] = min(ps[i + 1], ps[i]);
      //  cout << ps[i] << '\n';
    }
    for (int i = n; i >= 1; i --){
        lca[i][0] = ps[i];
        for (int j = 1; j <= lg; j ++){
            if (lca[i][j - 1] <= n) lca[i][j] = lca[lca[i][j - 1] + 1][j - 1];
        }
    }
    cin >> q;
    for (int i = 1; i <= q; i ++){
        int l, r; cin >> l >> r;
        int res = 0;
        for (int j = lg; j >= 0; j --){
            if (lca[l][j] > r) continue;
            l = lca[l][j] + 1;
            res += (1 << j);
        }
        cout << res << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...