#define _GLIBCXX_DEBUG #include using namespace std; mt19937 rng(450); using ll = long long; struct node { int l, r; int y; int cnt; ll sum; int val; ll to_add; /// можно добавить какую-нибудь информацию в каждую вершину node() : l(-1), r(-1), y(-1), cnt(-1), sum(0), val(0), to_add(0) {} ///val(-1) {} node(const int val_) : l(-1), r(-1), y(rng()), cnt(1), sum(val_), val(val_), to_add(0LL) {} ///val(val_) {} }; struct treap_manager { vector v; pair split (const int t, const int k) { if (t == -1) return pair(-1, -1); push(t); if (cnt(v[t].l) >= k) { ///int l, r; ///pair p = split(v[t].l, x0); ///l = p.first; r = p.second; auto [l, r] = split(v[t].l, k); v[t].l = r; recalc(t); return pair(l, t); } else { auto [l, r] = split(v[t].r, k - cnt(v[t].l) - 1); v[t].r = l; recalc(t); return pair(t, r); } } ll sum (const int t) { return t == -1 ? 0LL : v[t].sum; } void recalc (const int t) { if (t != -1) { v[t].cnt = cnt(v[t].l) + 1 + cnt(v[t].r); v[t].sum = sum(v[t].l) + v[t].val + sum(v[t].r); } } int merge (const int l, const int r) { if (l == -1) return r; if (r == -1) return l; push(l); push(r); if (v[l].y > v[r].y) { v[l].r = merge(v[l].r, r); recalc(l); return l; } else { v[r].l = merge(l, v[r].l); recalc(r); return r; } } int cnt (const int t) { return t == -1 ? 0 : v[t].cnt; } int newnode (const int val) { v.push_back(node(val)); return int(v.size()) - 1; } void insert (int &root, const int pos, const int val) { auto [l, r] = split(root, pos); const int m = newnode(val); root = merge(merge(l, m), r); } void remove (int &root, const int pos) { assert(0 <= pos && pos < cnt(root)); auto [l, temp] = split(root, pos); auto [m, r] = split(temp, 1); root = merge(l, r); } void assign (int &root, const int pos, const int val) { assert(0 <= pos && pos < cnt(root)); auto [l, temp] = split(root, pos); auto [m, r] = split(temp, 1); v[m].val = val; recalc(m); } int get_kth (const int root, const int k) { assert(root != -1); assert(0 <= k && k < cnt(root)); const int pivot = cnt(v[root].l); if (k < pivot) return get_kth(v[root].l, k); else if (k == pivot) return v[root].val; else return get_kth(v[root].r, k - pivot - 1); } int get_kth_stupid (int &root, const int k) { auto [l, temp] = split(root, k); auto [m, r] = split(temp, 1); assert(m != -1); const int ans = v[m].val; root = merge(merge(l, m), r); return ans; } /// [lb, rb) ll get_sum (int &root, const int lb, const int rb) { auto [l, temp] = split(root, lb); auto [m, r] = split(temp, rb - lb); const ll ans = sum(m); root = merge(merge(l, m), r); return ans; } void exchange_parts (int &root, const int pos) { auto [l, r] = split(root, pos); root = merge(r, l); } void apply (const int t, const int delta) { if (t != -1) { v[t].to_add += delta; v[t].val += delta; v[t].sum += delta; } } void push (const int t) { assert(t != -1); if (v[t].to_add != 0) { apply(v[t].l, v[t].to_add); apply(v[t].r, v[t].to_add); v[t].to_add = 0; } } void add_on_seg (int &root, const int lb, const int rb, const int delta) { auto [l, temp] = split(root, lb); auto [m, r] = split(temp, rb - lb); apply(m, delta); root = merge(merge(l, m), r); return ans; } }; int main() { treap_manager info; int n, m; cin >> n >> m; vector a(n); for (auto &it : a) cin >> it; int root = -1; for (int i = n - 1; i >= 0; i--) info.insert(root, 0, a[i]); for (int i = 0; i < m; i++) { int l, r; cin >> l >> r; --l; cout << info.get_sum(root, l, r) << "\n"; } }