#!/usr/bin/env python3 import math from ast import Call, parse, unparse, walk from bisect import bisect_left, bisect_right from inspect import currentframe, getsourcelines from sys import stdin _tokens = (y for x in stdin for y in x.split()) def read(): return next(_tokens) def iread(): return int(next(_tokens)) def dprint(*args, pretty=True): def _inner(v): def _format_3d(v): return '\n' + '\n'.join(['\n'.join([' '.join([str(z) for z in y]) for y in x]) + '\n' for x in v]).rstrip('\n') def _format_2d(v): return '\n' + '\n'.join([' '.join([str(y) for y in x]) for x in v]) def _dim(v): return (1 + min(_dim(x) for x in v) if v else 1) if isinstance(v, (list, tuple)) else 1 if isinstance(v, str) and len(v) > 1 else 0 dim = _dim(v) if pretty else -1 return _format_3d(v) if dim == 3 else _format_2d(v) if dim == 2 else str(v) frame = currentframe().f_back source_lines, start_line = getsourcelines(frame) tree = parse(source_lines[frame.f_lineno - max(1, start_line)].strip()) call_node = next(node for node in walk(tree) if isinstance(node, Call) and node.func.id == 'dprint') arg_names = [unparse(arg) for arg in call_node.args] print(', '.join([f'\033[4;35m{name}:\033[0m {_inner(value)}' for name, value in zip(arg_names, args)])) class SortedSet: BUCKET_RATIO = 16 SPLIT_RATIO = 24 def __init__(self, a=[]): a = list(a) n = len(a) if any(a[i] > a[i + 1] for i in range(n - 1)): a.sort() if any(a[i] >= a[i + 1] for i in range(n - 1)): a, b = [], a for x in b: if not a or a[-1] != x: a.append(x) n = self._size = len(a) num_bucket = int(math.ceil(math.sqrt(n / self.BUCKET_RATIO))) self._a = [a[n * i // num_bucket: n * (i + 1) // num_bucket] for i in range(num_bucket)] def __iter__(self): for i in self._a: for j in i: yield j def __reversed__(self): for i in reversed(self._a): for j in reversed(i): yield j def __eq__(self, other): return list(self) == list(other) def __len__(self): return self._size def __repr__(self): return 'SortedSet' + str(self._a) def __str__(self): s = str(list(self)) return '{' + s[1: len(s) - 1] + '}' def _position(self, x): for i, a in enumerate(self._a): if x <= a[-1]: break return (a, i, bisect_left(a, x)) def __contains__(self, x): if self._size == 0: return False a, _, i = self._position(x) return i != len(a) and a[i] == x def add(self, x): if self._size == 0: self._a = [[x]] self._size = 1 return True a, b, i = self._position(x) if i != len(a) and a[i] == x: return False a.insert(i, x) self._size += 1 if len(a) > len(self._a) * self.SPLIT_RATIO: mid = len(a) >> 1 self._a[b:b+1] = [a[:mid], a[mid:]] return True def _pop(self, a, b, i): ans = a.pop(i) self._size -= 1 if not a: del self._a[b] return ans def discard(self, x): if self._size == 0: return False a, b, i = self._position(x) if i == len(a) or a[i] != x: return False self._pop(a, b, i) return True def lt(self, x): for a in reversed(self._a): if a[0] < x: return a[bisect_left(a, x) - 1] def le(self, x): for a in reversed(self._a): if a[0] <= x: return a[bisect_right(a, x) - 1] def gt(self, x): for a in self._a: if a[-1] > x: return a[bisect_right(a, x)] def ge(self, x): for a in self._a: if a[-1] >= x: return a[bisect_left(a, x)] def __getitem__(self, i): if i < 0: for a in reversed(self._a): i += len(a) if i >= 0: return a[i] else: for a in self._a: if i < len(a): return a[i] i -= len(a) raise IndexError def pop(self, i=-1): if i < 0: for b, a in enumerate(reversed(self._a)): i += len(a) if i >= 0: return self._pop(a, ~b, i) else: for b, a in enumerate(self._a): if i < len(a): return self._pop(a, b, i) i -= len(a) raise IndexError def index(self, x): ans = 0 for a in self._a: if a[-1] >= x: return ans + bisect_left(a, x) ans += len(a) return ans def index_right(self, x): ans = 0 for a in self._a: if a[-1] > x: return ans + bisect_right(a, x) ans += len(a) return ans def max(self): return self._a[-1][-1] def min(self): return self._a[0][0] def main(): n = iread() h = [iread() for _ in range(n)] ss = SortedSet() tot = 0 ans = [] for i, x in enumerate(h): if i % 2 == 0: while True: if ss: le, ri = ss.min() if x < le: ss.add((1, x)) tot += x - 1 + 1 break elif x <= ri: ss.pop(0) ss.add((1, ri)) tot -= ri - le + 1 tot += ri - 1 + 1 break else: ss.pop(0) tot -= ri - le + 1 continue else: ss.add((1, x)) tot += x - 1 + 1 break else: while True: if not ss: break le, ri = ss.min() if x < le: break elif x < ri: ss.pop(0) ss.add((x + 1, ri)) tot -= ri - le + 1 tot += ri - (x + 1) + 1 break else: ss.pop(0) tot -= ri - le + 1 continue ans.append(tot) print(*ans, sep='\n') if __name__ == '__main__': main()