Submission #1368991

#TimeUsernameProblemLanguageResultExecution timeMemory
1368991pcheloveksLegendary Dango Eater (JOI26_dango)C++20
0 / 100
546 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;
};

jump j[20][DIM][10];

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];

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

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

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

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

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

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

            //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 = 19; p >= 0; p--) {
            if(curr + (1 << (p + 1)) <= r) {
                res += j[p][curr][bal].val;
                bal = j[p][curr][bal].toX;

                curr += (1 << (p + 1)); 
            }
        }
        res += j[0][curr][bal].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...