Advertisement
ec1117

Untitled

Dec 5th, 2020
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.21 KB | None | 0 0
  1. falling
  2.  
  3. int N, slope[MX], A[MX], Q[MX];
  4. frac ans[MX];
  5. deque<pair<pi,frac>> d;
  6.  
  7. frac lastBet(pi a, pi b) {
  8.     assert(a.s < b.s);
  9.     if (a.f <= b.f) return MOD;
  10.     return frac(b.s-a.s,a.f-b.f);
  11. }
  12.  
  13. void ad(pi a) {
  14.     while (1) {
  15.         if (!sz(d)) { d.push_front({a,MOD}); return; }
  16.         frac f = lastBet(a,d.ft.f);
  17.         if (!(f<d.ft.s)) { d.pop_front(); continue; }
  18.         d.push_front({a,f}); return;
  19.     }
  20. }
  21.  
  22. frac query(int a, int b) {
  23.     if (a <= d.bk.f.f) return -1;
  24.     int lo = 0, hi = sz(d)-1;
  25.     while (lo < hi) {
  26.         int mid = (lo+hi)/2;
  27.         if (!(d[mid].s<lastBet({a,b},d[mid].f))) hi = mid;
  28.         else lo = mid+1;
  29.     }
  30.     return lastBet({a,b},d[lo].f);
  31. }
  32.  
  33. void solve() {
  34.     vi v(N); iota(all(v),1);
  35.     sort(all(v),[](int a, int b) { return A[a] > A[b]; });
  36.     d = deque<pair<pi,frac>>();
  37.     trav(t,v) {
  38.         ad({slope[t],A[t]});
  39.         if (A[Q[t]] < A[t])
  40.             ans[t] = query(slope[Q[t]],A[Q[t]]);
  41.     }
  42. }
  43.  
  44. int main() {
  45.     ios_base::sync_with_stdio(0); cin.tie(0);
  46.     re(N);
  47.     FOR(i,1,N+1) {
  48.         re(A[i]);
  49.         slope[i] = -i;
  50.     }
  51.     FOR(i,1,N+1) re(Q[i]);
  52.     solve();
  53.     FOR(i,1,N+1) A[i] *= -1, slope[i] *= -1;
  54.     solve();
  55.     FOR(i,1,N+1) {
  56.         if (ans[i] == -1) ps(-1);
  57.         else ps(ans[i]);
  58.     }
  59.     // you should actually read the stuff at the bottom
  60. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement