Submission #1369001

#TimeUsernameProblemLanguageResultExecution timeMemory
1369001pcheloveksLegendary Dango Eater (JOI26_dango)C++20
5 / 100
2576 ms1114112 KiB
#define _CRT_SECURE_NO_WARNINGS
 
#include <bits/stdc++.h>
 
#define endl '\n'
 
//#pragma GCC optimize("Ofast")
 
using namespace std;
 
using ll = long long;
using ld = long double;
using pii = pair < int, int >;
using pll = pair < ll, ll >;
 
const ll INF = 2e18;
const ll DIM = 500007;
const ld PI = 3.1415926535;
const int mod = 998244353;

struct jump {
    int toX;
    ll val;
};

vector < vector < vector < jump > > > j;

int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0);
    cout.tie(0);
 
#ifdef IloveCP
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
#endif

    ll n, q, k;
    cin >> n >> q >> k;

    vector < ll > a(n + 1);
    for(int i = 1; i <= n; i++) cin >> a[i];

    j.resize(n + 1);

    for(int i = n; i >= 1; i--) {
        if(i % 2 == 0) continue;

        j[i].resize(k, vector < jump >(19));

        for(int x = 0; x < k; x++) {
            ll tmp = a[i];
            ll bal = x;

            if(bal + tmp >= k) {
                j[i][x][0].val++;
                tmp -= (k - bal);
                bal = 0;
            }

            j[i][x][0].val += tmp / k;
            tmp %= k;

            if(i + 2 <= n) {
                bal = max(bal + tmp - a[i + 1], (ll)0);
                j[i][x][0].toX = bal;
            }

            for(int p = 1; p < 19; p++) {
                if(i + (1 << p) <= n) {
                    j[i][x][p].val = j[i][x][p - 1].val + j[i + (1 << p)][j[i][x][p - 1].toX][p - 1].val;
                    j[i][x][p].toX = j[i + (1 << p)][j[i][x][p - 1].toX][p - 1].toX;
                }
                else {
                    j[i][x][p] = j[i][x][p - 1];
                }
            }

            //cout << j[0][i][x].val << " " << j[0][i][x].toX << endl;
            //cout << j[1][i][x].val << " " << j[1][i][x].toX << endl;
        }
    }

    for(int i = 0; i < q; i++) {
        int l, r;
        cin >> l >> r;
        if(l % 2 == 0) l++; 
        if(r % 2 == 0) r--;
        
        if(l > r) {
            cout << 0 << endl;
            continue;
        }

        int curr = l;
        ll bal = 0;
        ll res = 0;

        for(int p = 18; p >= 0; p--) {
            if(curr + (1 << (p + 1)) <= r) {
                res += j[curr][bal][p].val;
                bal = j[curr][bal][p].toX;

                curr += (1 << (p + 1)); 
            }
        }
        res += j[curr][bal][0].val;

        cout << res << endl;
    }


    return 0;
}
#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...