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();
}
}