Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- falling
- int N, slope[MX], A[MX], Q[MX];
- frac ans[MX];
- deque<pair<pi,frac>> d;
- frac lastBet(pi a, pi b) {
- assert(a.s < b.s);
- if (a.f <= b.f) return MOD;
- return frac(b.s-a.s,a.f-b.f);
- }
- void ad(pi a) {
- while (1) {
- if (!sz(d)) { d.push_front({a,MOD}); return; }
- frac f = lastBet(a,d.ft.f);
- if (!(f<d.ft.s)) { d.pop_front(); continue; }
- d.push_front({a,f}); return;
- }
- }
- frac query(int a, int b) {
- if (a <= d.bk.f.f) return -1;
- int lo = 0, hi = sz(d)-1;
- while (lo < hi) {
- int mid = (lo+hi)/2;
- if (!(d[mid].s<lastBet({a,b},d[mid].f))) hi = mid;
- else lo = mid+1;
- }
- return lastBet({a,b},d[lo].f);
- }
- void solve() {
- vi v(N); iota(all(v),1);
- sort(all(v),[](int a, int b) { return A[a] > A[b]; });
- d = deque<pair<pi,frac>>();
- trav(t,v) {
- ad({slope[t],A[t]});
- if (A[Q[t]] < A[t])
- ans[t] = query(slope[Q[t]],A[Q[t]]);
- }
- }
- int main() {
- ios_base::sync_with_stdio(0); cin.tie(0);
- re(N);
- FOR(i,1,N+1) {
- re(A[i]);
- slope[i] = -i;
- }
- FOR(i,1,N+1) re(Q[i]);
- solve();
- FOR(i,1,N+1) A[i] *= -1, slope[i] *= -1;
- solve();
- FOR(i,1,N+1) {
- if (ans[i] == -1) ps(-1);
- else ps(ans[i]);
- }
- // you should actually read the stuff at the bottom
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement