Submission #1316566

#TimeUsernameProblemLanguageResultExecution timeMemory
1316566nekolieHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
100 / 100
1559 ms103260 KiB
#include <bits/stdc++.h>
using namespace std;

const int M = 1000007, baza = (1<<20);
const long long inf = (1ll<<61);
int n,m, a[M], odp[M]; vector<tuple<int,long long,int>> query[M];
long long d[2*baza][2]; vector<int> ind;
void push(int v) {
    d[2*v][0] += d[v][1], d[2*v+1][0] += d[v][1];
    d[2*v][1] += d[v][1], d[2*v+1][1] += d[v][1];
    d[v][1] = 0;
}
void ustaw(int i, long long x) {
    int v = 1;
    for (int j = 19; j >= 0; j--)
        push(v), v = ((i&(1<<j)) ? 2*v+1 : 2*v);
    d[v][0] = x, v >>= 1;
    while (v > 0)
        d[v][0] = max(d[2*v][0],d[2*v+1][0]), v >>= 1;
}
void akt(int a, int b, int x, int v, int l, int r) {
    if (r < a || l > b)
        return;
    if (a <= l && r <= b)
        d[v][0] += x, d[v][1] += x;
    else
        push(v), akt(a,b,x,2*v,l,(l+r)/2), akt(a,b,x,2*v+1,(l+r)/2+1,r), d[v][0] = max(d[2*v][0],d[2*v+1][0]);
}
long long maks(int a, int b, int v, int l, int r) {
    if (r < a || l > b)
        return -inf;
    if (a <= l && r <= b)
        return d[v][0];
    else {
        push(v);
        return max(maks(a,b,2*v,l,(l+r)/2), maks(a,b,2*v+1,(l+r)/2+1,r));
    }
}
int main() {
    ios_base::sync_with_stdio(0);
    cin.tie(0); cout.tie(0);
    for (int i = 0; i < 2*baza; i++)
        d[i][0] = -inf;
    cin >> n >> m; int l,r,k;
    for (int i = 1; i <= n; i++)
        cin >> a[i];
    for (int i = 0; i < m; i++)
        cin >> l >> r >> k, query[l].push_back({r,1ll*k,i});
    a[n+1] = INT_MAX, ind.push_back(n+1);
    for (int i = n; i > 0; i--) {
        while (a[i] > a[ind.back()])
            ustaw(ind.back(),2*a[ind.back()]), akt(ind.back(),ind[ind.size()-2]-1,a[i]-a[ind.back()],1,0,baza-1), ind.pop_back();
        ind.push_back(i);
        for (auto [x,lim,j] : query[i])
            odp[j] = ((maks(i,x,1,0,baza-1) <= lim) ? 1 : 0);
    }
    for (int i = 0; i < m; i++)
        cout << odp[i] << "\n";
    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...
#Verdict Execution timeMemoryGrader output
Fetching results...