제출 #1337049

#제출 시각아이디문제언어결과실행 시간메모리
1337049julia_08Index (COCI21_index)C++20
110 / 110
213 ms50188 KiB
#include <bits/stdc++.h>
using namespace std;

const int MAXN = 2e5 + 1;

struct node{
  int sum, lc, rc;
};

int root[MAXN];

vector<node> seg;

int create(){
  seg.push_back({0, 0, 0});
  return (int) seg.size() - 1;
}

int update(int x, int lx, int rx, int i, int val){

  int nx = create();

  seg[nx] = seg[x];

  if(lx == rx){
    seg[nx].sum += val;
    return nx;
  }

  int m = (lx + rx) >> 1;

  if(i <= m){
    seg[nx].lc = update(seg[nx].lc, lx, m, i, val);
  } else seg[nx].rc = update(seg[nx].rc, m + 1, rx, i, val);

  seg[nx].sum = seg[seg[nx].lc].sum + seg[seg[nx].rc].sum;

  return nx;

}

int query(int x1, int x2, int lx, int rx, int val){

  int sum = seg[x2].sum - seg[x1].sum;

  if(sum <= val) return -1;

  if(lx == rx) return lx;

  int m = (lx + rx) >> 1;

  int bs_r = query(seg[x1].rc, seg[x2].rc, m + 1, rx, val + (m - lx + 1));

  if(bs_r != -1) return bs_r;
  return query(seg[x1].lc, seg[x2].lc, lx, m, val - (seg[seg[x2].rc].sum - seg[seg[x1].rc].sum));

}

int main(){
  cin.tie(0)->sync_with_stdio(0);

  int n, q; cin >> n >> q;

  create();
  create();

  int cur = 1;

  root[0] = cur;

  for(int i=1; i<=n; i++){

    int a; cin >> a;
    cur = update(cur, 1, MAXN, a, 1);

    root[i] = cur;

  }

  while(q--){
    int l, r; cin >> l >> r;
    cout << query(root[l - 1], root[r], 1, MAXN, 0) << "\n";
  }

  return 0;
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...