Submission #1355619

#TimeUsernameProblemLanguageResultExecution timeMemory
1355619kasamchiLegendary Dango Eater (JOI26_dango)C++20
23 / 100
1960 ms1114112 KiB
#include <bits/stdc++.h>
using namespace std;

int N, Q;
long long K;
vector<int> A;

struct SegTree {
    #define L(x) ((x) + (x))
    #define R(x) (L(x) + 1)

    vector<vector<int>> rem;
    vector<vector<long long>> ans;

    void build(int ll, int rr, int id) {
        if (ll == rr) {
            for (int k = 0; k < K; k++) {
                rem[id][k] = max(0, k + A[ll]);
                ans[id][k] = rem[id][k] / K;
                rem[id][k] %= K;
            }
        } else {
            int mm = ll + (rr - ll) / 2;
            build(ll, mm, L(id));
            build(mm + 1, rr, R(id));
            for (int k = 0; k < K; k++) {
                rem[id][k] = rem[R(id)][rem[L(id)][k]];
                ans[id][k] = ans[L(id)][k] + ans[R(id)][rem[L(id)][k]];
            }
        }
    }

    long long query(int ql, int qr, int ll, int rr, int id, vector<int> &retrem, vector<long long> &retans) {
        if (ql <= ll && rr <= qr) {
            retrem = rem[id];
            retans = ans[id];
            return retans[0];
        } else {
            int mm = ll + (rr - ll) / 2;
            if (ql <= mm && qr > mm) {
                vector<int> lrem, rrem;
                vector<long long> lans, rans;
                query(ql, qr, ll, mm, L(id), lrem, lans);
                query(ql, qr, mm + 1, rr, R(id), rrem, rans);
                retrem.resize(K), retans.resize(K);
                for (int k = 0; k < K; k++) {
                    retrem[k] = rrem[lrem[k]];
                    retans[k] = lans[k] + rans[lrem[k]];
                }
                return retans[0];
            } else if (ql <= mm) {
                return query(ql, qr, ll, mm, L(id), retrem, retans);
            } else {
                return query(ql, qr, mm + 1, rr, R(id), retrem, retans);
            }
        }
    }

    SegTree (void) {
        rem = vector<vector<int>>(N * 4, vector<int>(K));
        ans = vector<vector<long long>>(N * 4, vector<long long>(K));
    }
};

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> N >> Q >> K;
    A.resize(N);
    for (int i = 1; i <= N; i++) {
        cin >> A[i];
        if (~i & 1) {
            A[i] = -A[i];
        }
    }

    SegTree seg;
    seg.build(1, N, 1);

    while (Q--) {
        int L, R;
        cin >> L >> R;

        vector<int> retrem;
        vector<long long> retans;
        cout << seg.query(L, R, 1, N, 1, retrem, retans) << '\n';
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...