제출 #398212

#제출 시각아이디문제언어결과실행 시간메모리
398212definitelynotmeeHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++98
0 / 100
819 ms262144 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];
void merge(seg* &a, seg*& b, seg* &ret){
    
    ret->v.resize(a->v.size()+b->v.size());
    
    //cerr << "a=>" << a->best << ' ' << a->maxi << '\n' << "b=> " << b->best << ' ' << b->maxi << '\n';
    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);
    }
    ret->best = max(a->best, b->best);
    ret->maxi = max(a->maxi, b->maxi);
    merge(a->v.begin(), a->v.end(), b->v.begin(), b->v.end(), ret->v.begin());
    //cerr << "newbest = " << ret->best << ", newmaxi = " <<  ret->maxi << endl; 
}
 
void build(int id, int l, int r, vector<int> &v){
    tree[id] = new seg;
    if(l==r){
        tree[id]->maxi = v[l];
        tree[id]->v.emplace_back(v[l]);
        tree[id]->best = 0;
        return;
    }
    int e = id*2+1;
    int d= id*2+2;
    int m = (l+r)>>1;
    build(e,l,m,v);
    build(d,m+1,r,v);
    merge(tree[e],tree[d], tree[id]);
}
 
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);
        //cerr << l << ' ' << r << "->" << resp->best << endl;
        return;
    }
    int e = id*2+1;
    int d= id*2+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];
    build(0,0,n-1,v);
 
    for(int i = 0; i < m; i++){
        int a, b, c;
        cin >>a >> b >> c;
        a--;
        b--;
        seg *resp = new seg;
        query(0,0,n-1,a,b,resp);
        cout << (resp->best <= c) << '\n'; 
        free(resp);
    }
    
    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...