#include <iostream>
#include <cstring>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N = 500010;
struct Tree
{
int s[2], v, size, dat;
int sum;
}tr[N];
int n, m;
int x, y, z;
int idx, root;
void pushup(int u)
{
tr[u].size = tr[tr[u].s[0]].size + tr[tr[u].s[1]].size + 1;
tr[u].sum = tr[tr[u].s[0]].sum + tr[tr[u].s[1]].sum;
}
void split(int u, int sz, int &x, int &y)
{
if (!u) x = y = 0;
else
{
if (tr[tr[u].s[0]].size + 1 <= sz) x = u, split(tr[u].s[1], sz - tr[tr[u].s[0]].size - 1, tr[u].s[1], y);
else y = u, split(tr[u].s[0], sz, x, tr[u].s[0]);
pushup(u);
}
}
int merge(int a, int b)
{
if (!a || !b) return a + b;
if (tr[a].dat < tr[b].dat)
{
tr[a].s[1] = merge(tr[a].s[1], b);
pushup(a);
return a;
}
else
{
tr[b].s[0] = merge(a, tr[b].s[0]);
pushup(b);
return b;
}
}
int init(int v)
{
tr[ ++ idx].v = v, tr[idx].sum = v, tr[idx].size = 1, tr[idx].dat = rand();
return idx;
}
void insert(int v)
{
root = merge(root, init(v));
}
void modify(int u, int v)
{
split(root, u - 1, x, y), split(y, 1, y, z);
tr[y].v += v, tr[y].sum += v;
pushup(y);
root = merge(x, merge(y, z));
}
int query(int l, int r)
{
split(root, l - 1, x, y), split(y, r - l + 1, y, z);
int res = tr[y].sum;
root = merge(x, merge(y, z));
return res;
}
int main()
{
cin >> n >> m;
for (int i = 1; i <= n; i ++ )
{
int a;
cin >> a;
insert(a);
}
while (m -- )
{
int opt, l, r;
cin >> opt >> l >> r;
if (opt == 1) modify(l, r);
else cout << query(l, r) << endl;
}
return 0;
}