Submission #367227

#TimeUsernameProblemLanguageResultExecution timeMemory
367227piddddgyFire (JOI20_ho_t5)C++11
14 / 100
1089 ms24428 KiB
#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define cerr if(false) cerr
#define watch(x) cerr << (#x) << " is " << (x) << endl;
#define endl '\n'
#define ld long double
#define int long long
#define pii pair<int, int>
#define fi first
#define se second
#define sz(a) (int)(a).size()
#define all(x) (x).begin(), (x).end()

const int maxn = 200500;
int n, q;
int a[maxn];
int seg[4*maxn];

void upd( int pos, int val, int ind, int cl, int cr) {
    if(cl > cr) return;
    if(cl == cr) {
        // cerr << "setting " << ind << " to " << val << endl;
        seg[ind] = val;
    } else {
        int cm = (cl+cr)/2;
 
        if(pos <= cm) {
            upd(pos, val, 2*ind, cl, cm);
        } else {
            upd(pos, val, 2*ind+1, cm+1, cr);
        }
 
        seg[ind] = max(seg[2*ind], seg[2*ind+1]);
    }
}
 
int query(int l, int r, int ind, int cl, int cr) {
    if(cl > cr) return -1e18;
    if(l > r) return -1e18;
    
    if(cl == l and cr == r) {
        return seg[ind];
    }
 
    int cm = (cl+cr)/2;
    return max(query(l, min(cm, r), 2*ind, cl, cm),
            query(max(l, cm+1), r, 2*ind+1, cm+1, cr));
}

int t[maxn], l[maxn], r[maxn];

int psa[maxn];

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

    cin >> n >> q;
    for(int i = 1; i <= n; i++) {
        cin >> a[i];
        upd(i, a[i], 1, 1, n);
    }

    set<int> S;
    for(int i = 1; i <= q; i++) {
        cin >> t[i] >> l[i] >> r[i];
        S.emplace(t[i]);
    }

    if(sz(S) == 1) {
        int k = *S.begin();
        for(int i = 1; i <= n; i++) {
            psa[i] = query(max(1LL, i-k), i, 1, 1, n);
            psa[i] += psa[i-1];
        }

        for(int i = 1; i <= q; i++) {
            cout << psa[r[i]]-psa[l[i]-1] << endl;
        }
    } else {
        for(int i = 1; i <= q; i++) {
            watch(t[i])
            int ans = 0;
            for(int j = l[i]; j <= r[i]; j++) {
                int val = query(max(1LL, j-t[i]), j, 1, 1, n);
                cerr << j << " is " << val << endl;
                cerr << "quried " << max(1LL, j-t[i]) << "," << j << endl;
                ans += val;
            }

            cout << ans << endl;
        }
    }
}

/*



Did you read the bounds?
Did you make typos?
Are there edge cases (N=1?)
Are segay sizes proper?
Integer overflow?
DS reset properly between test cases?
Is using long longs causing TLE?
Are you using floating points?
*/
#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...