Submission #521789

#TimeUsernameProblemLanguageResultExecution timeMemory
521789LucaIlieHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++17
0 / 100
22 ms9476 KiB
#include <bits/stdc++.h>

#define MAX_N 1000
#define MAX_LOG_N 19
#define int long long

using namespace std;

int w[MAX_N];

struct sparseTable {
    struct nod {
        int maxW, maxEfort;
        set <int> s;
    };

    int n;
    nod table[MAX_N][MAX_LOG_N + 1];

    void init( int v[], int m ) {
        int i, p;

        n = m;

        for ( i = 0; i < n; i++ ) {
            table[i][0].maxW = v[i];
            table[i][0].maxEfort = 0;
            table[i][0].s.insert( -v[i] );
        }
        for ( p = 1; (1 << p) <= n; p++ ) {
            for ( i = 0; i <= n - (1 << p); i++ ) {
                table[i][p].maxW = max( table[i][p - 1].maxW, table[i + (1 << (p - 1))][p - 1].maxW );

                table[i][p].maxEfort = max( table[i][p - 1].maxEfort, table[i + (1 << (p - 1))][p - 1].maxEfort );
                auto x = table[i + (1 << (p - 1))][p - 1].s.lower_bound( -table[i][p - 1].maxW );
                if ( x != table[i + (1 << (p - 1))][p - 1].s.end() && -(*x) <= table[i][p - 1].maxW )
                    table[i][p].maxEfort = max( table[i][p].maxEfort, table[i][p - 1].maxW - (*x) );

                for ( auto it = table[i][p - 1].s.begin(); it != table[i][p - 1].s.end(); it++ )
                    table[i][p].s.insert( *it );
                for ( auto it = table[i + (1 << (p - 1))][p - 1].s.begin(); it != table[i + (1 << (p - 1))][p - 1].s.end(); it++ )
                    table[i][p].s.insert( *it );
            }
        }
    }

    int query( int l, int r ) {
        int len, e, mW, p;

        len = r - l + 1;

        e = 0;
        mW = 0;
        for ( p = 0; (1 << p) <= len; p++ ) {
            if ( len & (1 << p) ) {
                e = max( e, table[l][p].maxEfort );
                auto x = table[l][p].s.lower_bound( -mW );
                if ( x != table[l][p].s.end() && -(*x) <= mW )
                    e = max( e, mW - (*x) );
                mW = max( mW, table[l][p].maxW );
                l += (1 << p);
            }
        }

        return e;
    }
};

sparseTable shelf;

signed main() {
    int n, m, l, r, k, i;

    cin >> n >> m;
    for ( i = 0; i < n; i++ )
        cin >> w[i];

    shelf.init( w, n );

    for ( i = 0; i < m; i++ ) {
        cin >> l >> r >> k;

        if ( shelf.query( l - 1, r - 1 ) > k )
            cout << "0\n";
        else
            cout << "1\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...