Submission #1355557

#TimeUsernameProblemLanguageResultExecution timeMemory
1355557vjudge1Sum Zero (RMI20_sumzero)C++20
61 / 100
221 ms22628 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];
int old[maxN];
int sum[maxN];
int ps[maxN];
int res[maxN];
pair<int, int> t[maxN];
int main(){
   // cout << lg << '\n';
    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;
    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';
    }
    cin >> q;
    for (int i = 1; i <= q; i ++){
        cin >> t[i].first >> t[i].second;
    }
    for (int i = lg; i >= 0; i --){
        memset(lca, 0x3f, sizeof(lca));
        memset(old, 0x3f, sizeof(old));
        for (int p = 1; p <= n; p ++) lca[p] = ps[p];

        for (int j = 1; j <= i; j ++){
            swap(lca, old);
            for (int p = 1; p <= n; p ++){
                if (old[p] <= n) lca[p] = old[old[p] + 1];
                else lca[p] = 1e9;
            }
            lca[n + 1] = 1e9;
        }
        for (int id = 1; id <= q; id ++){
            if (t[id].first > t[id].second) continue;
            if (lca[t[id].first] > t[id].second) continue;
            t[id].first = lca[t[id].first] + 1;
            res[id] += (1 << i);
        }

    }
    for (int i = 1; i <= q; i ++) cout << res[i] << '\n';

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