#include <bits/stdc++.h>
using namespace std;
#define MAX_N 100005
int arr[MAX_N];
int tree[4 * MAX_N];
int lazy[4 * MAX_N];
void build(int node, int start, int end) {
if (start == end) {
tree[node] = arr[start];
return;
}
int mid = (start + end) / 2;
build(2 * node, start, mid);
build(2 * node + 1, mid + 1, end);
tree[node] = tree[2 node] + tree[2 node + 1];
}
void updateRange(int node, int start, int end, int l, int r, int val) {
if (lazy[node] != 0) {
tree[node] += (end - start + 1) * lazy[node];
if (start != end) {
lazy[2 * node] += lazy[node];
lazy[2 * node + 1] += lazy[node];
}
lazy[node] = 0;
}
if (start > end || start > r || end < l)
return;
if (start >= l && end <= r) {
tree[node] += (end - start + 1) * val;
if (start != end) {
lazy[2 * node] += val;
lazy[2 * node + 1] += val;
}
return;
}
int mid = (start + end) / 2;
updateRange(2 * node, start, mid, l, r, val);
updateRange(2 * node + 1, mid + 1, end, l, r, val);
tree[node] = tree[2 node] + tree[2 node + 1];
}
int queryRange(int node, int start, int end, int l, int r) {
if (start > end || start > r || end < l)
return 0;
if (lazy[node] != 0) {
tree[node] += (end - start + 1) * lazy[node];
if (start != end) {
lazy[2 * node] += lazy[node];
lazy[2 * node + 1] += lazy[node];
}
lazy[node] = 0;
}
if (start >= l && end <= r)
return tree[node];
int mid = (start + end) / 2;
int p1 = queryRange(2 * node, start, mid, l, r);
int p2 = queryRange(2 * node + 1, mid + 1, end, l, r);
return p1 + p2;
}
int main() {
int n;
cin >> n;
for (int i = 0; i < n; i++)
cin >> arr[i];
build(1, 0, n - 1);
// Example usage:
updateRange(1, 0, n - 1, 0, 3, 2);
cout << queryRange(1, 0, n - 1, 0, 3) << endl;
return 0;
}