Submission #1355559

#TimeUsernameProblemLanguageResultExecution timeMemory
1355559xorreverseSum Zero (RMI20_sumzero)C++20
100 / 100
246 ms21852 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];
long long sum[maxN];
int ps[maxN];
int res[maxN];
int cnt[maxN];
long long b[maxN];
pair<int, int> t[maxN];
int id[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];
        b[i] = sum[i];
    }
    sort(b, b + 1 + n);
    vector<long long> g;
    b[n + 1] = 1000000000000000000;
    for (int i = 0; i <= n; i ++){
        if (b[i] != b[i + 1]) g.push_back(b[i]);
    }
    ps[n + 1] = 1e9;
    for (int i = n; i >= 1; i --){
        int l = 0, r = (int)g.size() - 1, mid, ans = 0;
        while (l <= r){
            mid = (l + r) / 2;
            if (g[mid] >= sum[i]){
                r = mid - 1;
                ans = mid;
            }
            else l = mid + 1;
        }
        cnt[ans] = i;
        l = 0, r = (int)g.size() - 1, mid, ans = 0;
        while (l <= r){
            mid = (l + r) / 2;
            if (g[mid] >= sum[i - 1]){
                r = mid - 1;
                ans = mid;
            }
            else l = mid + 1;
        }
        ps[i] = cnt[ans];
        if (ps[i] == 0) ps[i] = 1e9;
        ps[i] = min(ps[i + 1], ps[i]);
    }
    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...