#include <bits/stdc++.h>
#include <ext/pb_ds/assoc_container.hpp>
#include <ext/pb_ds/tree_policy.hpp>
using namespace std;
using namespace __gnu_pbds;
#define fi first
#define sc second
typedef pair<int,int> pii;
typedef tree< pii, null_type, less<pii>, rb_tree_tag,
tree_order_statistics_node_update> ordered_set;
const int MAXN = 1e5+5;
int v[MAXN*2], id[MAXN*2], ans[MAXN*2], r[MAXN*2], mn[MAXN*2];
int GetBestPosition(int n, int c, int R, int *K, int *s, int *e) {
for(int i = 0; i < n-1; i++)v[i] = K[i] > R;
ordered_set st;
for(int i = 0; i < n; i++){
if(v[i] == 1)id[i] = i;
mn[i] = i;
r[i] = i;
st.insert({i,i});
}
int novo = n, resp = 0, idresp = 0;
for(int i = 0; i < c; i++){
int x = e[i]-s[i], l;
mn[novo] = n+1;
for(int j = 0; j <= x; j++){
auto it = st.find_by_order(s[i]);
if(j == 0)l = it->fi;
v[novo] += v[it->sc];
id[novo] += id[it->sc];
r[novo] = max(r[novo],r[it->sc]);
if(ans[novo] < ans[it->sc]){
ans[novo] = ans[it->sc];
mn[novo] = mn[it->sc];
}else if(ans[novo] == ans[it->sc])mn[novo] = min(mn[novo],mn[it->sc]);
st.erase(it);
}
st.insert({l, novo});
if(v[novo] > 1 || (v[id[novo]] == 1 && id[novo] != r[novo])){ans[novo] = 0;}
else{
ans[novo]++;
if(resp < ans[novo]){
resp = ans[novo];
idresp = mn[novo];
}
}
novo++;
}
return idresp;
}
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |
# | Verdict | Execution time | Memory | Grader output |
---|
Fetching results... |