Submission #1365023

#TimeUsernameProblemLanguageResultExecution timeMemory
1365023gelastropodUiro (JOI25_uiro)C++20
100 / 100
2465 ms199684 KiB
#include <bits/stdc++.h>
using namespace std;
#define int long long

signed main() {
    ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
    int N, Q, a, b; cin >> N;
    vector<int> A, precomp, preva, crnt, qA, qB;
    vector<vector<int>> idxs(101, vector<int>()), prefs(101, vector<int>(N + 1, 0)), sparse(18, vector<int>());
    for (int i = 0; i < N; i++) {
        cin >> a;
        A.push_back(a);
        idxs[a].push_back(i);
        prefs[0][i + 1] = prefs[0][i] + a;
        for (int j = 1; j <= 100; j++) prefs[j][i + 1] = prefs[j][i] + (a <= j ? -a : a);
    }
    cin >> Q;
    precomp.resize(Q, 0);
    crnt.resize(Q, 0);
    for (int i = 0; i < Q; i++) {
        cin >> a >> b; a--, b--;
        qA.push_back(a);
        qB.push_back(b);
        preva.push_back(a);
    }
    sparse[0].resize(N + 1, 0);
    for (int i = 1; i < 18; i++) sparse[i].resize(max(0LL, (int)sparse[i - 1].size() - (1LL << (i - 1))), 0);
    for (int i = 1; i <= 100; i++) {
        for (int j = 0; j <= N; j++) sparse[0][j] = prefs[i][j];
        for (int j = 1; j < 18; j++) 
            for (int k = 0; k < sparse[j].size(); k++)
                sparse[j][k] = min(sparse[j - 1][k], sparse[j - 1][k + (1LL << (j - 1))]);
        for (int j = 0; j < Q; j++) {
            auto iter1 = lower_bound(idxs[i].begin(), idxs[i].end(), qA[j]);
            auto iter2 = upper_bound(idxs[i].begin(), idxs[i].end(), qB[j]);
            if (iter1 == iter2) continue;
            int log2v = log2(qB[j] - qA[j] + 1);
            int minpref = min(sparse[log2v][qA[j] + 1], sparse[log2v][qB[j] + 2 - (1LL << log2v)]) - prefs[i][qA[j]] + precomp[j];
            minpref = max(0LL, -minpref);
            int numflip = (minpref + 2 * i - 1) / (2 * i);
            crnt[j] += iter2 - iter1 - numflip;
            preva[j] = qA[j];
            if (iter2 - iter1 > numflip - 1 && numflip) qA[j] = *(iter1 + numflip - 1) + 1;
            precomp[j] += prefs[i - 1][qA[j]] - prefs[i - 1][preva[j]];
        }
    }
    for (int i = 0; i < Q; i++) cout << crnt[i] << '\n';
}
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...