제출 #1153998

#제출 시각아이디문제언어결과실행 시간메모리
1153998YSH2020Index (COCI21_index)C++20
110 / 110
622 ms6272 KiB
#include <bits/stdc++.h>
using namespace std;
int ft[400005], X;
int qry(int idx) {
  int ans = 0;
  for (; idx > 0; idx -= idx&(-idx)) ans += ft[idx];
  return ans;
}
void add(int idx, int v) {
  for(; idx <= X; idx += (idx&-idx)) ft[idx] += v;
}
const int N = 500;
bool comp(pair<pair<int, int>,int> x, pair<pair<int, int>,int> y) {
  return make_pair(x.first.first/N, x.first.second) < make_pair(y.first.first/N, y.first.second);
}

int main() {
  X = 200001;
  int n; cin >> n;
  int q; cin >> q;
  int a[n]; for (int i = 0; i < n; i++) cin >> a[i];
  int ans[q];
  vector<pair<pair<int, int>, int>> queries(q);
  for (int i = 0; i < q; i++) {
    int s, e; cin >> s >> e;
    s--;e--;
    queries[i] = {{s, e}, i};
  }
  sort(queries.begin(), queries.end(), comp);
  int curL = 0;
  int curR = -1;
  multiset<int> s;
  for (auto x:queries) {
    while (curL < x.first.first) {
      add(a[curL], -1);
      curL++;
    }
    while (curL > x.first.first) {
      curL--;
      add(a[curL], 1);
    }
    while (curR < x.first.second) {
      curR++;
      add(a[curR], 1);
    }
    while (curR > x.first.second) {
      add(a[curR], -1);
      curR--;
    }
    int l = 0;
    int r = 200005;
    while (r-l > 1) {
      int mid = (r+l)/2;
      if (x.first.second-x.first.first+1-qry(mid-1) >= mid) l = mid;
      else r = mid;
    }
    ans[x.second] = l;
  }
  for (int i = 0; i < q; i++) cout << ans[i] << '\n';
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...