#include #include #include using namespace std; struct bod { int x, v; bod (int _x, int _v) : x(_x), v(_v) { } }; static vector veze; static vector obal; static void inicializuj_obal (bod &a) { obal.clear(); obal.push_back(a); } /* Vrátí true, jestliže bod B je nalevo od polopřímky z a_1 do a_2. */ static bool nalevo (bod &a1, bod &a2, bod &b) { bod dp(a2.x - a1.x, a2.v - a1.v); bod db(b.x - a1.x, b.v - a1.v); return dp.x * db.v > dp.v * db.x; } static void pridej_bod_do_obalu(bod &a) { while (obal.size() > 1) { vector::reverse_iterator i = obal.rbegin(); bod &posledni = *i; ++i; bod &predposledni = *i; if (nalevo(a, posledni, predposledni)) break; obal.pop_back(); } obal.push_back(a); } int main(void) { int n; scanf("%d", &n); int vzdalenost[n]; for (int i = 0; i < n; i++) { int x, v; scanf("%d%d", &x, &v); veze.push_back(bod(x, v)); vzdalenost[i] = 0; } inicializuj_obal(veze[0]); int k = 1; for (vector::iterator i = veze.begin() + 1; i != veze.end(); ++i, k++) { pridej_bod_do_obalu(*i); bod &predposledni = *(obal.rbegin() + 1); int dist = i->x - predposledni.x; vzdalenost[k] = dist; } bod a = veze.back(); a.x = -a.x; inicializuj_obal(a); k = n - 2; for (vector::reverse_iterator i = veze.rbegin() + 1; i != veze.rend(); ++i, k--) { a = *i; a.x = -a.x; pridej_bod_do_obalu(a); bod &predposledni = *(obal.rbegin() + 1); int dist = a.x - predposledni.x; if (vzdalenost[k] < dist) vzdalenost[k] = dist; } for (int i = 0; i < n; i++) printf("%d ", vzdalenost[i]); printf("\n"); return 0; }