#include <bits/stdc++.h>
using namespace std;

struct ostrov {
    int zac, kon; // index aktualneho zaciatku a konca
    int vyska; // vyska najvyssieho bodu
    list<int> maxima; // indexy najvyssich bodov
};

int main() {
    // nacitame vstup a odstranime po sebe iduce duplikaty
    int N;
    cin >> N;
    vector<int> pohorie;
    for (int n=0; n<N; ++n) {
        int vyska;
        cin >> vyska;
        if (n == 0 || vyska != pohorie.back()) pohorie.push_back(vyska);
    }
    N = pohorie.size();

    // usporiadame vsetky body vstupu podla vysky od najvyssej
    vector< pair<int,int> > udalosti;
    for (int n=0; n<N; ++n) udalosti.push_back( { pohorie[n], n } );
    sort( udalosti.begin(), udalosti.end() );
    reverse( udalosti.begin(), udalosti.end() );

    // inicializujeme prominenciu pre najvyssie hory sveta
    vector<int> prominencia(N, 0);
    int everest = *max_element( pohorie.begin(), pohorie.end() );
    for (int n=0; n<N; ++n) if (pohorie[n] == everest) prominencia[n] = everest;

    // simulujeme postupne vynaranie ostrovov a pocitame prominenciu ostatnych vrcholov
    vector<ostrov> ostrovy;
    vector<int> tu_zacina(N,-1), tu_konci(N,-1);
    for (const auto &rec : udalosti) {
        int kde = rec.second;
        bool ma_pred = (kde > 0 && tu_konci[kde-1] != -1);
        bool ma_za = (kde < N-1 && tu_zacina[kde+1] != -1);
        if (!ma_pred && !ma_za) {
            // vynoril sa novy ostrov
            ostrovy.push_back( {kde, kde, pohorie[kde], {kde} } );
            tu_zacina[kde] = tu_konci[kde] = ostrovy.size()-1;
            continue;
        }
        if (!ma_za) {
            // predlzujeme predchadzajuci ostrov doprava
            int o = tu_konci[kde-1];
            tu_konci[kde-1] = -1;
            tu_konci[kde] = o;
            ostrovy[o].kon = kde;
            continue;
        }
        if (!ma_pred) {
            // predlzujeme nasledujuci ostrov dolava
            int o = tu_zacina[kde+1];
            tu_zacina[kde+1] = -1;
            tu_zacina[kde] = o;
            ostrovy[o].zac = kde;
            continue;
        }
        // spajame dva ostrovy dokopy
        int o1 = tu_konci[kde-1], o2 = tu_zacina[kde+1];
        tu_konci[kde-1] = tu_zacina[kde+1] = -1;
        if (ostrovy[o1].vyska == ostrovy[o2].vyska) {
            // len spojime dokopy mnoziny miest kde maju maxima
            ostrovy[o1].maxima.splice( ostrovy[o1].maxima.end(), ostrovy[o2].maxima ); 
        } else {
            // prezije ten ostrov ktory je vyssi, druheho maximam nastavime prominenciu
            if (ostrovy[o1].vyska < ostrovy[o2].vyska) swap(o1, o2);
            for (int x : ostrovy[o2].maxima) prominencia[x] = pohorie[x] - pohorie[kde];
        }
        ostrovy[o1].zac = min(ostrovy[o1].zac, ostrovy[o2].zac);
        ostrovy[o1].kon = max(ostrovy[o1].kon, ostrovy[o2].kon);
        tu_zacina[ ostrovy[o1].zac ] = tu_konci[ ostrovy[o1].kon ] = o1;
    }

    // vypiseme vystup
    for (int x : prominencia) if (x > 0) cout << x << "\n";
}
