제출 #1192020

#제출 시각아이디문제언어결과실행 시간메모리
1192020SmuggingSpunIndex (COCI21_index)C++20
110 / 110
207 ms76356 KiB
#include<bits/stdc++.h>
#define taskname "E"
using namespace std;
const int lim = 2e5 + 5;
template<class T>void minimize(T& a, T b){
	if(a > b){
		a = b;
	}
}
int n, q, a[lim];
namespace sub1{
	void solve(){
		for(int _ = 0; _ < q; _++){
			int l, r;
			cin >> l >> r;
			vector<int>cnt(n + 1, 0);
			for(int i = l; i <= r; i++){
				cnt[a[i]]++;
			}
			for(int i = n, sum = 0; i > 0; i--){
				if((sum += cnt[i]) >= i){
					cout << i << "\n";
					break;
				}
			}
		}
	}
}
namespace sub23{
	struct Node{
		int cnt, lc, rc;
		Node(){
			this->cnt = 0;
		}
	};
	vector<Node>st;
	void build(int id, int l, int r){
		if(l == r){
			return;
		}
		int m = (l + r) >> 1;
		st.emplace_back(Node());
		build(st[id].lc = int(st.size()) - 1, l, m);
		st.emplace_back(Node());
		build(st[id].rc = int(st.size()) - 1, m + 1, r);
	}
	void update(int id, int l, int r, int p){
		st[id].cnt++;
		if(l == r){
			return;
		}
		int m = (l + r) >> 1;
		if(m < p){
			st.emplace_back(st[st[id].rc]);
			update(st[id].rc = int(st.size()) - 1, m + 1, r, p);
		}
		else{
			st.emplace_back(st[st[id].lc]);
			update(st[id].lc = int(st.size()) - 1, l, m, p);
		}
	}
	void solve(){
		st.assign(n + 1, Node());
		build(0, 1, n);
		for(int i = 1; i <= n; i++){
			st[i] = st[i - 1];
			update(i, 1, n, a[i]);
		}
		for(int _ = 0; _ < q; _++){
			int l, r, ans = 1;
			cin >> l >> r;
			int idl = l - 1, idr = r, cnt = 0, low = 1, high = n;
			while(low < high){
				int mid = (low + high) >> 1;
				if(cnt + st[st[idr].rc].cnt - st[st[idl].rc].cnt > mid){
					low = ans = mid + 1;
					idl = st[idl].rc;
					idr = st[idr].rc;
				}
				else{
					cnt += st[st[idr].rc].cnt - st[st[idl].rc].cnt;
					high = mid;
					idl = st[idl].lc;
					idr = st[idr].lc;
				}
			}
			cout << ans << "\n";
		}
	}
}
int main(){
	ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0);
	if(fopen(taskname".inp", "r")){
		freopen(taskname".inp", "r", stdin);
	}
	cin >> n >> q;
	for(int i = 1; i <= n; i++){
		cin >> a[i];
		minimize(a[i], n);
	}
	if(max(n, q) <= 1000){
		sub1::solve();
	}
	else{
		sub23::solve();
	}
}

컴파일 시 표준 에러 (stderr) 메시지

index.cpp: In function 'int main()':
index.cpp:94:24: warning: ignoring return value of 'FILE* freopen(const char*, const char*, FILE*)' declared with attribute 'warn_unused_result' [-Wunused-result]
   94 |                 freopen(taskname".inp", "r", stdin);
      |                 ~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...