Submission #398259

#TimeUsernameProblemLanguageResultExecution timeMemory
398259definitelynotmeeHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++98
64 / 100
660 ms262148 KiB
#include <bits/stdc++.h>
#define mp make_pair
#define mt make_tuple
#define ff first
#define ss second
using namespace std;
typedef long long ll;
typedef pair<int,int> pii;
typedef pair<ll,ll> pll;
const ll INFL = (1LL<<62)-1;
const int INF = (1<<30)-1;
const int MAXN = 1000001;

struct seg{
    int maxi = 0, best = 0;
    vector<int> v;
};
seg tree[4*MAXN];

inline void merge(seg a, seg &b, seg&ret, bool type){


    
    
    ret.maxi = max(a.maxi, b.maxi);
    ret.best = max(a.best, b.best);
    auto it = lower_bound(b.v.begin(),b.v.end(),a.maxi);
    if(it!=b.v.begin()){
        it--;
        ret.best = max(ret.best, *it+a.maxi);
    }
    
    if(type){
        ret.v.resize(a.v.size() + b.v.size());
        merge(a.v.begin(),a.v.end(),b.v.begin(),b.v.end(),ret.v.begin());
    }
}

void build(int id, int l, int r, vector<int> & v){
    if(l==r){
        tree[id].maxi = v[l];
        tree[id].best = 0;
        tree[id].v.emplace_back(v[l]);
        return;
    }
    int e = 2*id+1;
    int d = 2*id+2;
    int m = (l+r)>>1;
    build(e,l,m,v);
    build(d,m+1,r,v);
    merge(tree[e],tree[d],tree[id],1);
}

void query(int id, int l, int r, int ql, int qr, seg&resp){
    if(l>qr || r < ql)
        return;
    if(ql<=l && r <= qr){
        merge(resp,tree[id],resp,0);
        return;
    }
    int e = 2*id+1;
    int d = 2*id+2;
    int m = (l+r)>>1;
    query(e,l,m,ql,qr,resp);
    query(d,m+1,r,ql,qr,resp);
}

int main(){

    ios_base::sync_with_stdio(false);
    cin.tie(NULL);
    
    int n, m;
    cin >> n >> m;
    vector<int> v(n);
    for(int i = 0; i < n; i++)
        cin >> v[i];
    if(n<=2e5){
        build(0,0,n-1,v);

        for(int i = 0; i < m; i++){
            int a, b, c;
            cin >> a>> b >> c;
            a--, b--;
            seg cur;
            query(0,0,n-1,a,b,cur);
            cout <<  (cur.best <= c) << '\n';
        }
    } else {
        vector<vector<int>> sparse(n,vector<int>(25)); // fiz com sparse table só pra n falar que eu fiz 2 segs
        // guarda o primeiro indice a direita menor que v[i]
        set<int,greater<int>> s;
        vector<int> order(n);
        iota(order.begin(),order.end(),0);
        sort(order.begin(),order.end(),[&](int a, int b){return v[a]<v[b];});
        for(int i = 0; i < n; i++){
            
            auto aux = s.insert(order[i]);
            if(aux.first!=s.begin())
                aux.first--, sparse[order[i]][0] = *aux.first;
            else sparse[order[i]][0] = INF;
        }
        for(int i = 1; i < 25; i++){
            for(int j = 0; j < n - (1<<i-1); j++){
                sparse[j][i] = min(sparse[j][i-1], sparse[j+(1<<i-1)][i-1]);
            }
        }
        for(int i = 0; i < m; i++){
            int a, b, c;
            cin >> a >> b >>c;
            a--;
            b--;
            int logg = log2(b-a);
            cout << (min(sparse[a][logg],sparse[b-(1<<logg)+1][logg]) > b) << '\n';
        }
    }
    return 0;

}

Compilation message (stderr)

sortbooks.cpp: In function 'int main()':
sortbooks.cpp:104:41: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
  104 |             for(int j = 0; j < n - (1<<i-1); j++){
      |                                        ~^~
sortbooks.cpp:105:66: warning: suggest parentheses around '-' inside '<<' [-Wparentheses]
  105 |                 sparse[j][i] = min(sparse[j][i-1], sparse[j+(1<<i-1)][i-1]);
      |                                                                 ~^~
#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...