| # | Time | Username | Problem | Language | Result | Execution time | Memory | 
|---|---|---|---|---|---|---|---|
| 463971 | MahdiBahramian | A Difficult(y) Choice (BOI21_books) | C++14 | 0 ms | 0 KiB | 
This submission is migrated from previous version of oj.uz, which used different machine for grading. This submission may have different result if resubmitted.
#include<bits/stdc++.h>
#include<books.h>
#define pb push_back
#define F first
#define S second
#define mk make_pair
#define mt make_tuple
using namespace std;
typedef unsigned long long ll;
const int Max = 5e5 + 10;
ll ARR[Max]; bool ASK[Max];
int GET(int i)
{
	if(ASK[i]) return ARR[i];
	ASK[i] = 1;
	return ARR[i] = skim(i);
}
ll SUM(int l , int r)
{
	ll ans = 0;
	for(int i = l ; i <= r ; i++) ans += GET(i);
	return ans;
}
void solve(int N , int K , ll A , int S)
{
	if(SUM(1 , K) > 2 * A) return impossible();
	if(SUM(1 , K) >= A)
	{
		vector<int> res; for(int i = 1 ; i <= K ; i++) res.pb(i);
		return answer(res);
	}
	int l = 0 , r = N + 1;
	while(r - l > 1)
	{
		int md = (l + r) >> 1;
		if(SUM(1 , K - 1) + GET(md) >= A) r = md;
		else l = md;
	}
	
	if(SUM(1 , K - 1) + GET(r) <= 2 * A)
	{
		vector<int> res; for(int i = 1 ; i < K ; i++) res.pb(i); res.pb(r);
		return answer(res);
	}
	for(int ln = K - 1 ; ln >= 0 ; ln--)
	{
		if(SUM(1 , ln) + SUM(l - K + ln + 1 , l) >= A)
		{
			vector<int> res;
			for(int i = 1 ; i <= ln ; i++) res.pb(i);
			for(int i = l - K + ln + 1 ; i <= K ; i++) res.pb(i);
			return answer(res);
		}
	}
	
	return impossible();
}
