Submission #1338611

#TimeUsernameProblemLanguageResultExecution timeMemory
1338611DangKhoizzzzFish 3 (JOI24_fish3)C++20
100 / 100
639 ms158456 KiB

#include <bits/stdc++.h>

#define arr3 array <int , 3>
#define pii pair <int , int>
#define fi first
#define se second
#define BIT(x , k) ((x >> k)&1)
#define MASK(x) (1 << x)
#define int long long
#define ull unsigned long long

using namespace std;

const int maxn = 1e6 + 10;
const int INF = 1e18;

int mn[maxn][20] , suma[maxn] , sumc[maxn];
pii jump[maxn][20];
int n , D , c[maxn] , a[maxn] , q , cntD[maxn]; 


bool valid(int l , int r)
{
    int k = __lg(r-l+1);
    //cout << min(mn[l][k] , mn[r-(1<<k)+1][k]) << '\n';
    int mindiff = min(mn[l][k] , mn[r-(1<<k)+1][k]) + cntD[l]*D;
    if(mindiff < 0) return false;
    return true;
}
int sum_a(int l , int r) {return (suma[r] - suma[l-1]);}
int sum_c(int l , int r) {return (sumc[r] - sumc[l-1]);}
int sum(int l , int r)
{
    int cur = r;
    int res = 0;
    for(int bit = 19; bit >= 0; bit--)
    {
        if(jump[cur][bit].fi >= l)
        {
            res += jump[cur][bit].se;
            cur = jump[cur][bit].fi;
        }
    }
    res += (cur - l + 1)*(c[cur] - a[cur]);
    res += cntD[l]*(r-l+1);
    return res;
}

void solve()
{
    cin >> n >> D;
    for(int i = 1; i <= n; i++) cin >> c[i];
    a[0] = INF;
    stack <int> st;
    st.push(0);
    for(int i = 1; i <= n; i++)
    {
        cntD[i] = cntD[i-1] + (c[i]%D < c[i-1]%D);
        a[i] = cntD[i]*D + c[i]%D; 
        mn[i][0] = c[i] - a[i];
        suma[i] = suma[i-1] + a[i];
        sumc[i] = sumc[i-1] + c[i];

        while(c[st.top()] - a[st.top()] > c[i] - a[i]) st.pop();
        jump[i][0].fi = st.top();
        jump[i][0].se = (i - st.top())*(c[i] - a[i]);
        st.push(i);
    }
    for(int j = 1; j < 20; j++)
    {
        for(int i = 1; i + (1 << j)-1 <= n; i++)
        {
            mn[i][j] = min(mn[i][j-1] , mn[i+(1<<(j-1))][j-1]);
        }
        for(int i = 1; i <= n; i++)
        {
            jump[i][j].fi = jump[jump[i][j-1].fi][j-1].fi;
            jump[i][j].se = jump[i][j-1].se + jump[jump[i][j-1].fi][j-1].se;
        }
    }
    cin >> q;
    while(q--)
    {
        int l , r; cin >> l >> r;
        if(!valid(l , r)) {cout << -1 << '\n'; continue;}
        int ans = sum_c(l , r) - (sum_a(l , r) - cntD[l]*(r-l+1)) - sum(l , r);
        cout << ans/D << '\n';
    }
}

signed main()
{
    ios_base::sync_with_stdio(false);
    cin.tie(nullptr); cout.tie(nullptr);
    solve();
    return 0;
}
#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...