import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Main {
    static final int MAX_PRICE = 1000000000;
    static final int MIN_PRICE = 1;

    public static void main(String[] args) {
        // 標準入力の読み込み開始
        Scanner scanner = new Scanner(System.in);

        // 価格の数
        int n = scanner.nextInt();

        // 価格のリスト
        List<Integer> priceList = new ArrayList<Integer>();
        for (int i = 0; i < n; i++) {
            priceList.add(scanner.nextInt());
        }

        // 標準入力の読み込み終了
        scanner.close();

        // 処理実行
        System.out.println(getMaxProfit(priceList, MIN_PRICE - MAX_PRICE, -1));
    }

    static int getMaxProfit(List<Integer> priceList, int tempMaxProfit, int index_prevMax) {
        // 終了条件
        if (index_prevMax + 1 == priceList.size()) {
            // リストの最後まで検索した場合、これまでの最大値を返して処理終了
            return tempMaxProfit;
        }

        // 引数index_prevMax以降の最大値取得
        int max_index = getMaxIndexInArrayList(priceList, index_prevMax + 1, priceList.size());
        int max_price = priceList.get(max_index);

        // (引数index_prevMax以降、)最大値以前で最小値取得(初回実行の場合はindex_prevMax=0として実行)
        int min_index_before = getMinIndexInArrayList(priceList, ((index_prevMax == -1)? 0: index_prevMax), max_index);
        if (min_index_before == -1) {
            // 最大値以前で最小値が取得できない(最大値=最小値)場合
            // 以降の処理は不要なのでさっさと再実行
            return getMaxProfit(priceList, tempMaxProfit, max_index);
        }
        int min_price_before = priceList.get(min_index_before);

        // 最大値以降(、リストの最後まで)で最小値取得
        int min_price_after = priceList.get(getMinIndexInArrayList(priceList, max_index, priceList.size()));

        // 引数tempMaxProfitを再設定
        if((max_price - min_price_before) > tempMaxProfit) {
            tempMaxProfit = max_price - min_price_before;
        }

        // 最大値以前の最小値のほうが小さい場合
        if (min_price_before <= min_price_after) {
            // 処理終了
            return tempMaxProfit;
        }

        // 再実行
        return getMaxProfit(priceList, tempMaxProfit, max_index);
    }

    // リストから最大値のインデックスを取得する
    static int getMaxIndexInArrayList(List<Integer> priceList, int index_start, int index_end) {
        int max_price = MIN_PRICE - 1;
        int max_index = -1;

        for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) > max_price) {
                max_price = priceList.get(i);
                max_index = i;
            }
        }

        return max_index;
    }

    // リストから最小値のインデックスを取得する
    static int getMinIndexInArrayList(List<Integer> priceList, int index_start, int index_end) {
        int min_price = MAX_PRICE + 1;
        int min_index = -1;

        for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) < min_price) {
                min_price = priceList.get(i);
                min_index = i;
            }
        }

        return min_index;
    }
}
 import java.util.ArrayList; ArrayList java.util import java.util.List; List java.util import java.util.Scanner; Scanner java.util class Main {
    static final int MAX_PRICE = 1000000000;
    static final int MIN_PRICE = 1;

    public static void main(String[] args) {
        // 標準入力の読み込み開始
        Scanner scanner = new Scanner(System.in);

        // 価格の数
        int n = scanner.nextInt();

        // 価格のリスト
        List<Integer> priceList = new ArrayList<Integer>();
        for (int i = 0; i < n; i++) {
            priceList.add(scanner.nextInt());
        }

        // 標準入力の読み込み終了
        scanner.close();

        // 処理実行
        System.out.println(getMaxProfit(priceList, MIN_PRICE - MAX_PRICE, -1));
    }

    static int getMaxProfit(List<Integer> priceList, int tempMaxProfit, int index_prevMax) {
        // 終了条件
        if (index_prevMax + 1 == priceList.size()) {
            // リストの最後まで検索した場合、これまでの最大値を返して処理終了
            return tempMaxProfit;
        }

        // 引数index_prevMax以降の最大値取得
        int max_index = getMaxIndexInArrayList(priceList, index_prevMax + 1, priceList.size());
        int max_price = priceList.get(max_index);

        // (引数index_prevMax以降、)最大値以前で最小値取得(初回実行の場合はindex_prevMax=0として実行)
        int min_index_before = getMinIndexInArrayList(priceList, ((index_prevMax == -1)? 0: index_prevMax), max_index);
        if (min_index_before == -1) {
            // 最大値以前で最小値が取得できない(最大値=最小値)場合
            // 以降の処理は不要なのでさっさと再実行
            return getMaxProfit(priceList, tempMaxProfit, max_index);
        }
        int min_price_before = priceList.get(min_index_before);

        // 最大値以降(、リストの最後まで)で最小値取得
        int min_price_after = priceList.get(getMinIndexInArrayList(priceList, max_index, priceList.size()));

        // 引数tempMaxProfitを再設定
        if((max_price - min_price_before) > tempMaxProfit) {
            tempMaxProfit = max_price - min_price_before;
        }

        // 最大値以前の最小値のほうが小さい場合
        if (min_price_before <= min_price_after) {
            // 処理終了
            return tempMaxProfit;
        }

        // 再実行
        return getMaxProfit(priceList, tempMaxProfit, max_index);
    }

    // リストから最大値のインデックスを取得する
    static int getMaxIndexInArrayList(List<Integer> priceList, int index_start, int index_end) {
        int max_price = MIN_PRICE - 1;
        int max_index = -1;

        for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) > max_price) {
                max_price = priceList.get(i);
                max_index = i;
            }
        }

        return max_index;
    }

    // リストから最小値のインデックスを取得する
    static int getMinIndexInArrayList(List<Integer> priceList, int index_start, int index_end) {
        int min_price = MAX_PRICE + 1;
        int min_index = -1;

        for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) < min_price) {
                min_price = priceList.get(i);
                min_index = i;
            }
        }

        return min_index;
    }
} Main static final int MAX_PRICE = 1000000000; MAX_PRICE 1000000000 static final int MIN_PRICE = 1; MIN_PRICE 1 public static void main(String[] args) {
        // 標準入力の読み込み開始
        Scanner scanner = new Scanner(System.in);

        // 価格の数
        int n = scanner.nextInt();

        // 価格のリスト
        List<Integer> priceList = new ArrayList<Integer>();
        for (int i = 0; i < n; i++) {
            priceList.add(scanner.nextInt());
        }

        // 標準入力の読み込み終了
        scanner.close();

        // 処理実行
        System.out.println(getMaxProfit(priceList, MIN_PRICE - MAX_PRICE, -1));
    } main {
        // 標準入力の読み込み開始
        Scanner scanner = new Scanner(System.in);

        // 価格の数
        int n = scanner.nextInt();

        // 価格のリスト
        List<Integer> priceList = new ArrayList<Integer>();
        for (int i = 0; i < n; i++) {
            priceList.add(scanner.nextInt());
        }

        // 標準入力の読み込み終了
        scanner.close();

        // 処理実行
        System.out.println(getMaxProfit(priceList, MIN_PRICE - MAX_PRICE, -1));
    } Scanner scanner = new Scanner(System.in); scanner new Scanner(System.in) int n = scanner.nextInt(); n scanner.nextInt() scanner.nextInt scanner List<Integer> priceList = new ArrayList<Integer>(); priceList new ArrayList<Integer>() for (int i = 0; i < n; i++) {
            priceList.add(scanner.nextInt());
        } int i = 0; int i = 0; i 0 i < n i n i++ i++ i {
            priceList.add(scanner.nextInt());
        } {
            priceList.add(scanner.nextInt());
        } priceList.add(scanner.nextInt()) priceList.add priceList scanner.nextInt() scanner.nextInt scanner scanner.close() scanner.close scanner System.out.println(getMaxProfit(priceList, MIN_PRICE - MAX_PRICE, -1)) System.out.println System.out System System.out getMaxProfit(priceList, MIN_PRICE - MAX_PRICE, -1) getMaxProfit priceList MIN_PRICE - MAX_PRICE MIN_PRICE MAX_PRICE -1 1 String[] args args static int getMaxProfit(List<Integer> priceList, int tempMaxProfit, int index_prevMax) {
        // 終了条件
        if (index_prevMax + 1 == priceList.size()) {
            // リストの最後まで検索した場合、これまでの最大値を返して処理終了
            return tempMaxProfit;
        }

        // 引数index_prevMax以降の最大値取得
        int max_index = getMaxIndexInArrayList(priceList, index_prevMax + 1, priceList.size());
        int max_price = priceList.get(max_index);

        // (引数index_prevMax以降、)最大値以前で最小値取得(初回実行の場合はindex_prevMax=0として実行)
        int min_index_before = getMinIndexInArrayList(priceList, ((index_prevMax == -1)? 0: index_prevMax), max_index);
        if (min_index_before == -1) {
            // 最大値以前で最小値が取得できない(最大値=最小値)場合
            // 以降の処理は不要なのでさっさと再実行
            return getMaxProfit(priceList, tempMaxProfit, max_index);
        }
        int min_price_before = priceList.get(min_index_before);

        // 最大値以降(、リストの最後まで)で最小値取得
        int min_price_after = priceList.get(getMinIndexInArrayList(priceList, max_index, priceList.size()));

        // 引数tempMaxProfitを再設定
        if((max_price - min_price_before) > tempMaxProfit) {
            tempMaxProfit = max_price - min_price_before;
        }

        // 最大値以前の最小値のほうが小さい場合
        if (min_price_before <= min_price_after) {
            // 処理終了
            return tempMaxProfit;
        }

        // 再実行
        return getMaxProfit(priceList, tempMaxProfit, max_index);
    } getMaxProfit {
        // 終了条件
        if (index_prevMax + 1 == priceList.size()) {
            // リストの最後まで検索した場合、これまでの最大値を返して処理終了
            return tempMaxProfit;
        }

        // 引数index_prevMax以降の最大値取得
        int max_index = getMaxIndexInArrayList(priceList, index_prevMax + 1, priceList.size());
        int max_price = priceList.get(max_index);

        // (引数index_prevMax以降、)最大値以前で最小値取得(初回実行の場合はindex_prevMax=0として実行)
        int min_index_before = getMinIndexInArrayList(priceList, ((index_prevMax == -1)? 0: index_prevMax), max_index);
        if (min_index_before == -1) {
            // 最大値以前で最小値が取得できない(最大値=最小値)場合
            // 以降の処理は不要なのでさっさと再実行
            return getMaxProfit(priceList, tempMaxProfit, max_index);
        }
        int min_price_before = priceList.get(min_index_before);

        // 最大値以降(、リストの最後まで)で最小値取得
        int min_price_after = priceList.get(getMinIndexInArrayList(priceList, max_index, priceList.size()));

        // 引数tempMaxProfitを再設定
        if((max_price - min_price_before) > tempMaxProfit) {
            tempMaxProfit = max_price - min_price_before;
        }

        // 最大値以前の最小値のほうが小さい場合
        if (min_price_before <= min_price_after) {
            // 処理終了
            return tempMaxProfit;
        }

        // 再実行
        return getMaxProfit(priceList, tempMaxProfit, max_index);
    } if (index_prevMax + 1 == priceList.size()) {
            // リストの最後まで検索した場合、これまでの最大値を返して処理終了
            return tempMaxProfit;
        } index_prevMax + 1 == priceList.size() index_prevMax + 1 index_prevMax 1 priceList.size() priceList.size priceList {
            // リストの最後まで検索した場合、これまでの最大値を返して処理終了
            return tempMaxProfit;
        } return tempMaxProfit; tempMaxProfit int max_index = getMaxIndexInArrayList(priceList, index_prevMax + 1, priceList.size()); max_index getMaxIndexInArrayList(priceList, index_prevMax + 1, priceList.size()) getMaxIndexInArrayList priceList index_prevMax + 1 index_prevMax 1 priceList.size() priceList.size priceList int max_price = priceList.get(max_index); max_price priceList.get(max_index) priceList.get priceList max_index int min_index_before = getMinIndexInArrayList(priceList, ((index_prevMax == -1)? 0: index_prevMax), max_index); min_index_before getMinIndexInArrayList(priceList, ((index_prevMax == -1)? 0: index_prevMax), max_index) getMinIndexInArrayList priceList ((index_prevMax == -1)? 0: index_prevMax) (index_prevMax == -1) index_prevMax -1 1 0 index_prevMax max_index if (min_index_before == -1) {
            // 最大値以前で最小値が取得できない(最大値=最小値)場合
            // 以降の処理は不要なのでさっさと再実行
            return getMaxProfit(priceList, tempMaxProfit, max_index);
        } min_index_before == -1 min_index_before -1 1 {
            // 最大値以前で最小値が取得できない(最大値=最小値)場合
            // 以降の処理は不要なのでさっさと再実行
            return getMaxProfit(priceList, tempMaxProfit, max_index);
        } return getMaxProfit(priceList, tempMaxProfit, max_index); getMaxProfit(priceList, tempMaxProfit, max_index) getMaxProfit priceList tempMaxProfit max_index int min_price_before = priceList.get(min_index_before); min_price_before priceList.get(min_index_before) priceList.get priceList min_index_before int min_price_after = priceList.get(getMinIndexInArrayList(priceList, max_index, priceList.size())); min_price_after priceList.get(getMinIndexInArrayList(priceList, max_index, priceList.size())) priceList.get priceList getMinIndexInArrayList(priceList, max_index, priceList.size()) getMinIndexInArrayList priceList max_index priceList.size() priceList.size priceList if((max_price - min_price_before) > tempMaxProfit) {
            tempMaxProfit = max_price - min_price_before;
        } (max_price - min_price_before) > tempMaxProfit (max_price - min_price_before) max_price min_price_before tempMaxProfit {
            tempMaxProfit = max_price - min_price_before;
        } tempMaxProfit = max_price - min_price_before tempMaxProfit max_price - min_price_before max_price min_price_before if (min_price_before <= min_price_after) {
            // 処理終了
            return tempMaxProfit;
        } min_price_before <= min_price_after min_price_before min_price_after {
            // 処理終了
            return tempMaxProfit;
        } return tempMaxProfit; tempMaxProfit return getMaxProfit(priceList, tempMaxProfit, max_index); getMaxProfit(priceList, tempMaxProfit, max_index) getMaxProfit priceList tempMaxProfit max_index List<Integer> priceList priceList int tempMaxProfit tempMaxProfit int index_prevMax index_prevMax // リストから最大値のインデックスを取得する
    static int getMaxIndexInArrayList(List<Integer> priceList, int index_start, int index_end) {
        int max_price = MIN_PRICE - 1;
        int max_index = -1;

        for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) > max_price) {
                max_price = priceList.get(i);
                max_index = i;
            }
        }

        return max_index;
    } getMaxIndexInArrayList {
        int max_price = MIN_PRICE - 1;
        int max_index = -1;

        for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) > max_price) {
                max_price = priceList.get(i);
                max_index = i;
            }
        }

        return max_index;
    } int max_price = MIN_PRICE - 1; max_price MIN_PRICE - 1 MIN_PRICE 1 int max_index = -1; max_index -1 1 for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) > max_price) {
                max_price = priceList.get(i);
                max_index = i;
            }
        } int i = index_start; int i = index_start; i index_start i < index_end i index_end i++ i++ i {
            if (priceList.get(i) > max_price) {
                max_price = priceList.get(i);
                max_index = i;
            }
        } {
            if (priceList.get(i) > max_price) {
                max_price = priceList.get(i);
                max_index = i;
            }
        } if (priceList.get(i) > max_price) {
                max_price = priceList.get(i);
                max_index = i;
            } priceList.get(i) > max_price priceList.get(i) priceList.get priceList i max_price {
                max_price = priceList.get(i);
                max_index = i;
            } max_price = priceList.get(i) max_price priceList.get(i) priceList.get priceList i max_index = i max_index i return max_index; max_index List<Integer> priceList priceList int index_start index_start int index_end index_end // リストから最小値のインデックスを取得する
    static int getMinIndexInArrayList(List<Integer> priceList, int index_start, int index_end) {
        int min_price = MAX_PRICE + 1;
        int min_index = -1;

        for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) < min_price) {
                min_price = priceList.get(i);
                min_index = i;
            }
        }

        return min_index;
    } getMinIndexInArrayList {
        int min_price = MAX_PRICE + 1;
        int min_index = -1;

        for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) < min_price) {
                min_price = priceList.get(i);
                min_index = i;
            }
        }

        return min_index;
    } int min_price = MAX_PRICE + 1; min_price MAX_PRICE + 1 MAX_PRICE 1 int min_index = -1; min_index -1 1 for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) < min_price) {
                min_price = priceList.get(i);
                min_index = i;
            }
        } int i = index_start; int i = index_start; i index_start i < index_end i index_end i++ i++ i {
            if (priceList.get(i) < min_price) {
                min_price = priceList.get(i);
                min_index = i;
            }
        } {
            if (priceList.get(i) < min_price) {
                min_price = priceList.get(i);
                min_index = i;
            }
        } if (priceList.get(i) < min_price) {
                min_price = priceList.get(i);
                min_index = i;
            } priceList.get(i) < min_price priceList.get(i) priceList.get priceList i min_price {
                min_price = priceList.get(i);
                min_index = i;
            } min_price = priceList.get(i) min_price priceList.get(i) priceList.get priceList i min_index = i min_index i return min_index; min_index List<Integer> priceList priceList int index_start index_start int index_end index_end
import java.util.ArrayList;
import java.util.List;
import java.util.Scanner;

class Main {
    static final int MAX_PRICE = 1000000000;
    static final int MIN_PRICE = 1;

    public static void main(String[] args) {
        // 標準入力の読み込み開始
        Scanner scanner = new Scanner(System.in);

        // 価格の数
        int n = scanner.nextInt();

        // 価格のリスト
        List<Integer> priceList = new ArrayList<Integer>();
        for (int i = 0; i < n; i++) {
            priceList.add(scanner.nextInt());
        }

        // 標準入力の読み込み終了
        scanner.close();

        // 処理実行
        System.out.println(getMaxProfit(priceList, MIN_PRICE - MAX_PRICE, -1));
    }

    static int getMaxProfit(List<Integer> priceList, int tempMaxProfit, int index_prevMax) {
        // 終了条件
        if (index_prevMax + 1 == priceList.size()) {
            // リストの最後まで検索した場合、これまでの最大値を返して処理終了
            return tempMaxProfit;
        }

        // 引数index_prevMax以降の最大値取得
        int max_index = getMaxIndexInArrayList(priceList, index_prevMax + 1, priceList.size());
        int max_price = priceList.get(max_index);

        // (引数index_prevMax以降、)最大値以前で最小値取得(初回実行の場合はindex_prevMax=0として実行)
        int min_index_before = getMinIndexInArrayList(priceList, ((index_prevMax == -1)? 0: index_prevMax), max_index);
        if (min_index_before == -1) {
            // 最大値以前で最小値が取得できない(最大値=最小値)場合
            // 以降の処理は不要なのでさっさと再実行
            return getMaxProfit(priceList, tempMaxProfit, max_index);
        }
        int min_price_before = priceList.get(min_index_before);

        // 最大値以降(、リストの最後まで)で最小値取得
        int min_price_after = priceList.get(getMinIndexInArrayList(priceList, max_index, priceList.size()));

        // 引数tempMaxProfitを再設定
        if((max_price - min_price_before) > tempMaxProfit) {
            tempMaxProfit = max_price - min_price_before;
        }

        // 最大値以前の最小値のほうが小さい場合
        if (min_price_before <= min_price_after) {
            // 処理終了
            return tempMaxProfit;
        }

        // 再実行
        return getMaxProfit(priceList, tempMaxProfit, max_index);
    }

    // リストから最大値のインデックスを取得する
    static int getMaxIndexInArrayList(List<Integer> priceList, int index_start, int index_end) {
        int max_price = MIN_PRICE - 1;
        int max_index = -1;

        for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) > max_price) {
                max_price = priceList.get(i);
                max_index = i;
            }
        }

        return max_index;
    }

    // リストから最小値のインデックスを取得する
    static int getMinIndexInArrayList(List<Integer> priceList, int index_start, int index_end) {
        int min_price = MAX_PRICE + 1;
        int min_index = -1;

        for (int i = index_start; i < index_end; i++) {
            if (priceList.get(i) < min_price) {
                min_price = priceList.get(i);
                min_index = i;
            }
        }

        return min_index;
    }
}

