import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.OutputStreamWriter;
import java.io.PrintWriter;
import java.util.PriorityQueue;


// 注意类名必须为 Main, 不要有任何 package xxx 信息
public class Main {
public static void main(String[] args) throws IOException {
        BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
        PrintWriter out = new PrintWriter(new OutputStreamWriter(System.out));

        int n = Integer.parseInt(br.readLine());

        String[] str = br.readLine().split("\\s+");

        long[] p = new long[n];

        for (int i = 0; i < n; i++) {
            p[i] = Long.parseLong(str[i]);
        }
        PriorityQueue<Long> minHeap = new PriorityQueue<>(); // 小顶堆:堆顶始终是当前堆中最小值
        long profit = 0; // 初始化总利润为0

        for (int i = 0; i < n; i++) {
            minHeap.add(p[i]); // 将当前价格加入堆
            if (minHeap.peek() < p[i]) { // 如果堆顶(当前最低价格)< 当前价格 → 可以低买高卖
                long buy = minHeap.poll(); // 取出堆顶(买入价)
                profit += p[i] - buy; // 累加本次利润(当前价-买入价)
                minHeap.add(p[i]); // 把当前价格重新入堆(相当于“卖出后再以当前价买入”,继续后续交易)
            }
        }
        out.println(profit);
        out.flush();
        out.close();
        br.close();

    }
}