#[allow(unused_imports)]
use proconio::input;
use itertools::Itertools;
use std::collections::{BtreeMap, BtreeSet, HashMap, HashSet, VecDeque};
use std::cmp::{min, max, Ordering};
fn lower_bound<T: Ord>(vec: &[T], value: T) -> usize {
vec.binary_search_by(|x| {
if *x < value {
Ordering::Less
} else {
Ordering::Greater
}
})
.err()
.unwrap()
}
fn upper_bound<T: Ord>(vec: &[T], value: T) -> usize {
vec.binary_search_by(|x| {
if *x <= value {
Ordering::Less
} else {
Ordering::Greater
}
})
.err()
.unwrap()
}
// n以下の最大の数を返す
fn max_under_n<T: Ord>(vec: &[T], value: T) -> Option<usize> {
vec.binary_search_by(|x| {
if *x <= value {
Ordering::Less
} else {
Ordering::Greater
}
})
.err()
.map(|x| if x == 0 {
None
} else {
Some(x - 1)
})
.flatten()
}
struct UnionFind {
parent: Vec<usize>,
size: Vec<usize>,
}
impl UnionFind {
fn new(n: usize) -> Self {
Self {
parent: (0..n).collect(),
size: vec![1; n],
}
}
fn find(&mut self, x: usize) -> usize {
if self.parent[x] != x {
let root = self.find(self.parent[x]);
self.parent[x] = root;
}
self.parent[x]
}
fn unite(&mut self, x: usize, y: usize) -> bool {
let mut x = self.find(x);
let mut y = self.find(y);
if x == y {
return false;
}
if self.size[x] < self.size[y] {
std::mem::swap(&mut x, &mut y);
}
self.parent[y] = x;
self.size[x] += self.size[y];
true
}
fn same(&mut self, x: usize, y: usize) -> bool {
self.find(x) == self.find(y)
}
fn size(&mut self, x: usize) -> usize {
let root = self.find(x);
self.size[root]
}
fn count_roots(&mut self, n: usize) -> usize {
(1..=n)
.map(|i| self.find(i))
.collect::<HashSet<_>>()
.len()
}
}
#[allow(unused)]
fn main() {
input! {
n: usize,
a: [usize; n],
}
let mut ans = 0;
for i in a {
ans += i;
}
println!("{ans}");
}