#include "prize.h"
#include <bits/stdc++.h>
using namespace std;
#define fi first
#define se second
#define pb push_back
#define ll long long
#define ld long double
void ckmx(int &x,int y){x=max(x,y);}
void ckmn(int &x,int y){x=min(x,y);}
const int N=2e5+50,S=500;
vector<int>odgovor[N];
int MAKS;
struct BIT{
int T[N+50];
void Update(int i,int x){i+=10;for(;i<=N;i+=i&-i)T[i]+=x;}
int Get(int i){i+=10;int x=0;for(;i>=1;i-=i&-i)x+=T[i];return x;}
int Get(int l,int r){return Get(r)-Get(l-1);}
}bt;
void Solve(int l,int r){
if(l>r) return;
int mid=l+r>>1;
odgovor[mid]=ask(mid);
if(odgovor[mid][0]+odgovor[mid][1]!=MAKS){
bt.Update(mid,1);
Solve(l,mid-1),Solve(mid+1,r);
}
else{
int levo=odgovor[mid][0]-bt.Get(l-1);
if(levo) Solve(l,mid-1);
int desno=odgovor[mid][1]-bt.Get(r+1,N);
if(desno) Solve(mid+1,r);
}
}
int find_best(int n){
for(int i=0;i<min(S,n);i++){
odgovor[i]=ask(i);
ckmx(MAKS,odgovor[i][0]+odgovor[i][1]);
}
Solve(0,n-1);
int res=0;
for(int i=0;i<n;i++){
if(odgovor[i].empty()) continue;
if(odgovor[i][0]+odgovor[i][1]==0) res=i;
}
return res;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |