Submission #1357067

#TimeUsernameProblemLanguageResultExecution timeMemory
1357067JohanHedgehog Daniyar and Algorithms (IZhO19_sortbooks)C++20
64 / 100
3103 ms288360 KiB
#include <bits/stdc++.h>
using namespace std;
// #define int long long
const int N = 1e6 + 5;
const int INF = 1e18;
const int LG = 21;
int n, q, st[N * 4], a[N];
map < int , vector < pair < int , int > > > adj;
pair < int , int > up[N][LG];
void build(int v, int l, int r){
  if(l == r){
    st[v] = a[l];
    return;
  }
  int mid = (l + r) >> 1;
  build(v * 2, l, mid);
  build(v * 2 + 1, mid + 1, r);
  st[v] = max(st[v * 2], st[v * 2 + 1]);
}
int ask(int v, int l, int r, int ql, int qr){
  if(l > qr || r < ql)return -INF;
  if(l >= ql && r <= qr)return st[v];
  int mid = (l + r) >> 1;
  return max(ask(v * 2, l, mid, ql, qr), ask(v * 2 + 1, mid + 1, r, ql, qr));
}
int get(int l, int r){
  if(l > r)
    return 0;
  return ask(1, 1, n, l, r);
}
void dfs(int u, int p, int edge){
  up[u][0] = {p, edge};
  for(int i = 1; i < LG; i++){
    up[u][i].first = up[up[u][i - 1].first][i - 1].first;
    up[u][i].second = max(up[u][i - 1].second, up[up[u][i - 1].first][i - 1].second);
  }
  for(auto [v, w] : adj[u]){
    dfs(v, u, w);
  }
}
signed main(){
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  cin >> n >> q;
  for(int i = 1; i <= n; i++)
    cin >> a[i];
  build(1, 1, n);
  for(int i = 1; i <= n; i++){
    int l = i + 1, r = n;
    int best = n + 1;
    while(r >= l){
      int mid = (l + r) >> 1;
      if(get(i + 1, mid) >= a[i]){
        best = mid;
        r = mid - 1;
      }
      else l = mid + 1;
    }
    int cost = 0;
    if(i + 1 <= best - 1 && best != n + 1)
      cost += get(i + 1, best - 1) + a[i];
    // cout << i << '-' << best << ";;" << cost << endl;
    adj[best].push_back({i, cost});
  }
  dfs(n + 1, n + 1, 0);
  while(q--){
    int l, r, k;
    cin >> l >> r >> k;
    int node = l, mx = 0;
    for(int i = LG - 1; i >= 0; i--){
      if(up[node][i].first <= r){
        mx = max(mx, up[node][i].second);
        node = up[node][i].first;
      }
    }
    if(node + 1 <= r)
      mx = max(mx, get(node + 1, r) + a[node]);
    cout << (mx > k ? 0 : 1) << endl;
  }
}

Compilation message (stderr)

sortbooks.cpp:5:17: warning: overflow in conversion from 'double' to 'int' changes value from '1.0e+18' to '2147483647' [-Woverflow]
    5 | const int INF = 1e18;
      |                 ^~~~
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...
#Result Execution timeMemoryGrader output
Fetching results...