#include<bits\stdc++.h>
using namespace std;
#define int long long
struct node
{
int sum=0;
int arr[41] = { 0 };
node(int x = 0) {
arr[x] = 1;
sum = 0;
}
};
node out()
{
return node(0);
}
node proces(node a, node b)
{
node c;
c.sum = a.sum + b.sum;
int sum = 0;;
for (int i = 1; i <= 40; i++)
{
c.arr[i] = a.arr[i] + b.arr[i];
c.sum += sum*a.arr[i];
sum += b.arr[i];
}
return c;
}
int const nn = 4e5 + 1;
int n;
int a1[nn];
node tree1[nn];
void build_tree(node *tree, int *a, int s, int e, int ind)
{
if (s == e)
{
tree[ind] = node(a[s]);
return;
}
int mid = (s + e) / 2;
build_tree(tree, a, s, mid, ind * 2);
build_tree(tree, a, mid + 1, e, (ind * 2) + 1);
tree[ind] = proces(tree[ind * 2], tree[(ind * 2) + 1]);
return;
}
node query(node *tree, int ss, int se, int qs, int qe, int ind)
{
//complete overlap
if (ss >= qs && se <= qe)
return tree[ind];
// no overlap
if (qe<ss || qs>se)
return out();
int mid = (ss + se) / 2;
node left = query(tree, ss, mid, qs, qe, ind * 2);
node right = query(tree, mid + 1, se, qs, qe, ind * 2 + 1);
return proces(left, right);
}
void update(node *tree, int ss, int se, int i, int new_val, int ind)
{
//case where the I is out of bound
if (i > se || i < ss)
return;
// leaf node
if (ss == se)
{
tree[ind] = node(new_val);
return;
}
//otherwise
int mid = (ss + se) / 2;
update(tree, ss, mid, i, new_val, ind * 2);
update(tree, mid + 1, se, i, new_val, ind * 2 + 1);
tree[ind] = proces(tree[ind * 2], tree[ind * 2 + 1]);
return;
}
int32_t main()
{
int n, m;
cin >> n >> m;
for (int i = 1; i <= n; i++)
cin >> a1[i];
build_tree(tree1, a1, 1, n, 1);
while (m--)
{
int ty;
cin >> ty;
if (ty == 1)
{
int x, y;
cin >> x >> y;
node num = query(tree1, 1, n, x, y, 1);
cout << num.sum << endl;
}
else {
int ind, v;
cin >> ind >> v;
update(tree1, 1, n, ind, v, 1);
}
}
}
I2luY2x1ZGU8Yml0c1xzdGRjKysuaD4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBpbnQgbG9uZyBsb25nCgoKc3RydWN0IG5vZGUKewoJaW50IHN1bT0wOwoJaW50IGFycls0MV0gPSB7IDAgfTsKCW5vZGUoaW50IHggPSAwKSB7CgkJYXJyW3hdID0gMTsKCQlzdW0gPSAwOwoJfQoKfTsKbm9kZSBvdXQoKQp7CglyZXR1cm4gbm9kZSgwKTsKfQpub2RlIHByb2Nlcyhub2RlIGEsIG5vZGUgYikKewoJbm9kZSBjOwoJYy5zdW0gPSBhLnN1bSArIGIuc3VtOwoJaW50IHN1bSA9IDA7OwoJZm9yIChpbnQgaSA9IDE7IGkgPD0gNDA7IGkrKykKCXsKCQljLmFycltpXSA9IGEuYXJyW2ldICsgYi5hcnJbaV07CgkJYy5zdW0gKz0gc3VtKmEuYXJyW2ldOwoJCXN1bSArPSBiLmFycltpXTsKCX0KCXJldHVybiBjOwp9CmludCBjb25zdCBubiA9IDRlNSArIDE7CmludCBuOwppbnQgYTFbbm5dOwpub2RlIHRyZWUxW25uXTsKdm9pZCBidWlsZF90cmVlKG5vZGUgKnRyZWUsIGludCAqYSwgaW50IHMsIGludCBlLCBpbnQgaW5kKQp7CglpZiAocyA9PSBlKQoJewoJCXRyZWVbaW5kXSA9IG5vZGUoYVtzXSk7CgkJcmV0dXJuOwoJfQoJaW50IG1pZCA9IChzICsgZSkgLyAyOwoJYnVpbGRfdHJlZSh0cmVlLCBhLCBzLCBtaWQsIGluZCAqIDIpOwoJYnVpbGRfdHJlZSh0cmVlLCBhLCBtaWQgKyAxLCBlLCAoaW5kICogMikgKyAxKTsKCXRyZWVbaW5kXSA9IHByb2Nlcyh0cmVlW2luZCAqIDJdLCB0cmVlWyhpbmQgKiAyKSArIDFdKTsKCXJldHVybjsKfQpub2RlIHF1ZXJ5KG5vZGUgKnRyZWUsIGludCBzcywgaW50IHNlLCBpbnQgcXMsIGludCBxZSwgaW50IGluZCkKewoJLy9jb21wbGV0ZSBvdmVybGFwCglpZiAoc3MgPj0gcXMgJiYgc2UgPD0gcWUpCgkJcmV0dXJuIHRyZWVbaW5kXTsKCgkvLyBubyBvdmVybGFwCglpZiAocWU8c3MgfHwgcXM+c2UpCgkJcmV0dXJuIG91dCgpOwoJaW50IG1pZCA9IChzcyArIHNlKSAvIDI7Cglub2RlIGxlZnQgPSBxdWVyeSh0cmVlLCBzcywgbWlkLCBxcywgcWUsIGluZCAqIDIpOwoJbm9kZSByaWdodCA9IHF1ZXJ5KHRyZWUsIG1pZCArIDEsIHNlLCBxcywgcWUsIGluZCAqIDIgKyAxKTsKCXJldHVybiBwcm9jZXMobGVmdCwgcmlnaHQpOwoKfQp2b2lkIHVwZGF0ZShub2RlICp0cmVlLCBpbnQgc3MsIGludCBzZSwgaW50IGksIGludCBuZXdfdmFsLCBpbnQgaW5kKQp7CgkvL2Nhc2Ugd2hlcmUgdGhlIEkgaXMgb3V0IG9mIGJvdW5kIAoJaWYgKGkgPiBzZSB8fCBpIDwgc3MpCgkJcmV0dXJuOwoKCS8vIGxlYWYgbm9kZSAKCWlmIChzcyA9PSBzZSkKCXsKCQl0cmVlW2luZF0gPSBub2RlKG5ld192YWwpOwoJCXJldHVybjsKCX0KCS8vb3RoZXJ3aXNlIAoJaW50IG1pZCA9IChzcyArIHNlKSAvIDI7Cgl1cGRhdGUodHJlZSwgc3MsIG1pZCwgaSwgbmV3X3ZhbCwgaW5kICogMik7Cgl1cGRhdGUodHJlZSwgbWlkICsgMSwgc2UsIGksIG5ld192YWwsIGluZCAqIDIgKyAxKTsKCgl0cmVlW2luZF0gPSBwcm9jZXModHJlZVtpbmQgKiAyXSwgdHJlZVtpbmQgKiAyICsgMV0pOwoJcmV0dXJuOwp9CgppbnQzMl90IG1haW4oKQp7CglpbnQgbiwgbTsKCWNpbiA+PiBuID4+IG07Cglmb3IgKGludCBpID0gMTsgaSA8PSBuOyBpKyspCgkJY2luID4+IGExW2ldOwoJYnVpbGRfdHJlZSh0cmVlMSwgYTEsIDEsIG4sIDEpOwoJd2hpbGUgKG0tLSkKCXsKCQlpbnQgdHk7CgkJY2luID4+IHR5OwoJCWlmICh0eSA9PSAxKQoJCXsKCQkJaW50IHgsIHk7CgkJCWNpbiA+PiB4ID4+IHk7CgkJCW5vZGUgbnVtID0gcXVlcnkodHJlZTEsIDEsIG4sIHgsIHksIDEpOwoJCQljb3V0IDw8IG51bS5zdW0gPDwgZW5kbDsKCQl9CgkJZWxzZSB7CgkJCWludCBpbmQsIHY7CgkJCWNpbiA+PiBpbmQgPj4gdjsKCQkJdXBkYXRlKHRyZWUxLCAxLCBuLCBpbmQsIHYsIDEpOwoJCX0KCgl9Cn0=