// Success consists of going from failure to failure without loss of enthusiasm
#include <bits/stdc++.h>
using namespace std;
#define nl '\n'
mt19937 rng(1008);
const int MX = 2e5;
const int MOD = 1e9 + 7;
const int base = 37;
vector<int> pows = {1};
// treap node
struct node {
int val, pri, sz = 1;
long long sum; // sum of values in the treap
// (propagated value)
bool flip; // whether this node should be reversed
node *left, *right;
node(int v) {
sum = val = v; // set sum and val to the value of the node
flip = 0; // default to no reversals needed
pri = (rng() % MOD); // set priority of node
left = right = NULL; // set children to null
}
};
// getter methods
int get_size(node* t) { return t ? t->sz : 0; };
long long get_sum(node* t) { return t ? t->sum : 0; };
void prop(node* t) {
if (!t || !t->flip) return; // if nothing to propagate
swap(t->left, t->right); // perform the flip
// propagate to left child (if it exists)
if (t->left) t->left->flip ^= 1;
// propagate to right child (if it exists)
if (t->right) t->right->flip ^= 1;
t->flip = 0; // reset flip value (reversal was performed)
}
node* comp(node* t) {
if (t == NULL) return t;
prop(t->left); prop(t->right); // propagate to children
// maintain the treap's size
t->sz = 1 + get_size(t->left) + get_size(t->right);
// maintain the sum of values in the treap
t->sum = t->val + get_sum(t->left) + get_sum(t->right);
return t;
}
// merge two treaps (l is to the left of r)
node* merge(node* l, node* r) {
// if one of the nodes is null, return the other
if (!l || !r) return l ? l : r;
prop(l); prop(r);
// whichever is higher priority is the root
if (l->pri > r->pri) {
// l is root, merge right child with r
l->right = merge(l->right, r);
return comp(l);
} else {
// r is root, merge left child with l
r->left = merge(l, r->left);
return comp(r);
}
}
// split treap into 2 -> "amount" nodes in the left half
pair<node*, node*> split_by_amount(node* t, int amount) {
if (t == NULL) return {t, t};
prop(t);
if (get_size(t->left) >= amount) {
auto [l, r] = split_by_amount(t->left, amount);
t->left = r;
return {l, comp(t)};
} else {
auto [l, r] = split_by_amount(t->right, amount - get_size(t->left) - 1);
t->right = l;
return {comp(t), r};
}
}
// split treap into 2 -> values with < v and >= v
// pair<node*, node*> split_by_value(node* t, int v) {
// if (t == NULL) return {t, t};
// if (t->val >= v) {
// auto [l, r] = split_by_value(t->left, v);
// t->left = r;
// return {l, comp(t)};
// } else {
// auto [l, r] = split_by_value(t->right, v);
// t->right = l;
// return {comp(t), r};
// }
// }
int main() {
cin.tie(0)->sync_with_stdio(0);
int N, Q; cin >> N >> Q;
node* T = NULL;
for(int i = 0; i < N; i++) {
int x; cin >> x;
// build treap
T = merge(T, new node(x));
}
while(Q--) {
int t; cin >> t; --t;
if (t == 0) {
int l, r; cin >> l >> r; --l, --r;
auto [L, M] = split_by_amount(T, l);
auto [m, R] = split_by_amount(M, r - l + 1);
// obtain the treap for [l, r]
m->flip ^= 1; // update flip value for root
// return treap to original state
T = merge(L, merge(m, R));
}
if (t == 1) {
int l, r; cin >> l >> r; --l, --r;
auto [L, M] = split_by_amount(T, l);
auto [m, R] = split_by_amount(M, r - l + 1);
// obtain the treap for [l, r]
cout << m->sum << nl; // output sum of values in treap
// return treap to original state
T = merge(L, merge(m, R));
}
}
exit(0-0);
}
// Breathe In, Breathe Out
Ly8gU3VjY2VzcyBjb25zaXN0cyBvZiBnb2luZyBmcm9tIGZhaWx1cmUgdG8gZmFpbHVyZSB3aXRob3V0IGxvc3Mgb2YgZW50aHVzaWFzbQojaW5jbHVkZSA8Yml0cy9zdGRjKysuaD4KCnVzaW5nIG5hbWVzcGFjZSBzdGQ7CgojZGVmaW5lIG5sICdcbicKCm10MTk5Mzcgcm5nKDEwMDgpOwoKY29uc3QgaW50IE1YID0gMmU1Owpjb25zdCBpbnQgTU9EID0gMWU5ICsgNzsKY29uc3QgaW50IGJhc2UgPSAzNzsKCnZlY3RvcjxpbnQ+IHBvd3MgPSB7MX07CgoKLy8gdHJlYXAgbm9kZQpzdHJ1Y3Qgbm9kZSB7CglpbnQgdmFsLCBwcmksIHN6ID0gMTsKCWxvbmcgbG9uZyBzdW07IC8vIHN1bSBvZiB2YWx1ZXMgaW4gdGhlIHRyZWFwCgoJLy8gKHByb3BhZ2F0ZWQgdmFsdWUpCglib29sIGZsaXA7IC8vIHdoZXRoZXIgdGhpcyBub2RlIHNob3VsZCBiZSByZXZlcnNlZAoJCglub2RlICpsZWZ0LCAqcmlnaHQ7CgoJbm9kZShpbnQgdikgewoJCXN1bSA9IHZhbCA9IHY7IC8vIHNldCBzdW0gYW5kIHZhbCB0byB0aGUgdmFsdWUgb2YgdGhlIG5vZGUKCQlmbGlwID0gMDsgLy8gZGVmYXVsdCB0byBubyByZXZlcnNhbHMgbmVlZGVkCgkJcHJpID0gKHJuZygpICUgTU9EKTsgLy8gc2V0IHByaW9yaXR5IG9mIG5vZGUKCQlsZWZ0ID0gcmlnaHQgPSBOVUxMOyAvLyBzZXQgY2hpbGRyZW4gdG8gbnVsbAoJfQp9OwoKLy8gZ2V0dGVyIG1ldGhvZHMKaW50IGdldF9zaXplKG5vZGUqIHQpIHsgcmV0dXJuIHQgPyB0LT5zeiA6IDA7IH07CmxvbmcgbG9uZyBnZXRfc3VtKG5vZGUqIHQpIHsgcmV0dXJuIHQgPyB0LT5zdW0gOiAwOyB9OwoKdm9pZCBwcm9wKG5vZGUqIHQpIHsKCWlmICghdCB8fCAhdC0+ZmxpcCkgcmV0dXJuOyAvLyBpZiBub3RoaW5nIHRvIHByb3BhZ2F0ZQoKCXN3YXAodC0+bGVmdCwgdC0+cmlnaHQpOyAvLyBwZXJmb3JtIHRoZSBmbGlwCgkKCS8vIHByb3BhZ2F0ZSB0byBsZWZ0IGNoaWxkIChpZiBpdCBleGlzdHMpCglpZiAodC0+bGVmdCkgdC0+bGVmdC0+ZmxpcCBePSAxOyAKCgkvLyBwcm9wYWdhdGUgdG8gcmlnaHQgY2hpbGQgKGlmIGl0IGV4aXN0cykKCWlmICh0LT5yaWdodCkgdC0+cmlnaHQtPmZsaXAgXj0gMTsgCgoJdC0+ZmxpcCA9IDA7IC8vIHJlc2V0IGZsaXAgdmFsdWUgKHJldmVyc2FsIHdhcyBwZXJmb3JtZWQpCn0KCm5vZGUqIGNvbXAobm9kZSogdCkgewoJaWYgKHQgPT0gTlVMTCkgcmV0dXJuIHQ7Cglwcm9wKHQtPmxlZnQpOyBwcm9wKHQtPnJpZ2h0KTsgLy8gcHJvcGFnYXRlIHRvIGNoaWxkcmVuCgoJLy8gbWFpbnRhaW4gdGhlIHRyZWFwJ3Mgc2l6ZQoJdC0+c3ogPSAxICsgZ2V0X3NpemUodC0+bGVmdCkgKyBnZXRfc2l6ZSh0LT5yaWdodCk7CgoJLy8gbWFpbnRhaW4gdGhlIHN1bSBvZiB2YWx1ZXMgaW4gdGhlIHRyZWFwCgl0LT5zdW0gPSB0LT52YWwgKyBnZXRfc3VtKHQtPmxlZnQpICsgZ2V0X3N1bSh0LT5yaWdodCk7CglyZXR1cm4gdDsKfQoKLy8gbWVyZ2UgdHdvIHRyZWFwcyAobCBpcyB0byB0aGUgbGVmdCBvZiByKQpub2RlKiBtZXJnZShub2RlKiBsLCBub2RlKiByKSB7IAoJLy8gaWYgb25lIG9mIHRoZSBub2RlcyBpcyBudWxsLCByZXR1cm4gdGhlIG90aGVyCglpZiAoIWwgfHwgIXIpIHJldHVybiBsID8gbCA6IHI7CgoJcHJvcChsKTsgcHJvcChyKTsKCS8vIHdoaWNoZXZlciBpcyBoaWdoZXIgcHJpb3JpdHkgaXMgdGhlIHJvb3QKCWlmIChsLT5wcmkgPiByLT5wcmkpIHsKCQkvLyBsIGlzIHJvb3QsIG1lcmdlIHJpZ2h0IGNoaWxkIHdpdGggcgoJCWwtPnJpZ2h0ID0gbWVyZ2UobC0+cmlnaHQsIHIpOwoJCXJldHVybiBjb21wKGwpOwoJfSBlbHNlIHsKCQkvLyByIGlzIHJvb3QsIG1lcmdlIGxlZnQgY2hpbGQgd2l0aCBsCgkJci0+bGVmdCA9IG1lcmdlKGwsIHItPmxlZnQpOwoJCXJldHVybiBjb21wKHIpOwoJfQkKfQoKLy8gc3BsaXQgdHJlYXAgaW50byAyIC0+ICJhbW91bnQiIG5vZGVzIGluIHRoZSBsZWZ0IGhhbGYKcGFpcjxub2RlKiwgbm9kZSo+IHNwbGl0X2J5X2Ftb3VudChub2RlKiB0LCBpbnQgYW1vdW50KSB7IAoJaWYgKHQgPT0gTlVMTCkgcmV0dXJuIHt0LCB0fTsKCglwcm9wKHQpOwoJaWYgKGdldF9zaXplKHQtPmxlZnQpID49IGFtb3VudCkgewoJCWF1dG8gW2wsIHJdID0gc3BsaXRfYnlfYW1vdW50KHQtPmxlZnQsIGFtb3VudCk7CgkJdC0+bGVmdCA9IHI7CgkJcmV0dXJuIHtsLCBjb21wKHQpfTsJCgl9IGVsc2UgewoJCWF1dG8gW2wsIHJdID0gc3BsaXRfYnlfYW1vdW50KHQtPnJpZ2h0LCBhbW91bnQgLSBnZXRfc2l6ZSh0LT5sZWZ0KSAtIDEpOwoJCXQtPnJpZ2h0ID0gbDsKCQlyZXR1cm4ge2NvbXAodCksIHJ9OwoJfQp9CgovLyBzcGxpdCB0cmVhcCBpbnRvIDIgLT4gdmFsdWVzIHdpdGggPCB2IGFuZCA+PSB2Ci8vIHBhaXI8bm9kZSosIG5vZGUqPiBzcGxpdF9ieV92YWx1ZShub2RlKiB0LCBpbnQgdikgeyAKLy8gCWlmICh0ID09IE5VTEwpIHJldHVybiB7dCwgdH07CgovLyAJaWYgKHQtPnZhbCA+PSB2KSB7Ci8vIAkJYXV0byBbbCwgcl0gPSBzcGxpdF9ieV92YWx1ZSh0LT5sZWZ0LCB2KTsKLy8gCQl0LT5sZWZ0ID0gcjsKLy8gCQlyZXR1cm4ge2wsIGNvbXAodCl9OwkKLy8gCX0gZWxzZSB7Ci8vIAkJYXV0byBbbCwgcl0gPSBzcGxpdF9ieV92YWx1ZSh0LT5yaWdodCwgdik7Ci8vIAkJdC0+cmlnaHQgPSBsOwovLyAJCXJldHVybiB7Y29tcCh0KSwgcn07Ci8vIAl9Ci8vIH0KCgoKaW50IG1haW4oKSB7CgljaW4udGllKDApLT5zeW5jX3dpdGhfc3RkaW8oMCk7CgoKCWludCBOLCBROyBjaW4gPj4gTiA+PiBROwoKCW5vZGUqIFQgPSBOVUxMOwoJZm9yKGludCBpID0gMDsgaSA8IE47IGkrKykgewoJCWludCB4OyBjaW4gPj4geDsKCQkvLyBidWlsZCB0cmVhcAoJCVQgPSBtZXJnZShULCBuZXcgbm9kZSh4KSk7Cgl9CgoJd2hpbGUoUS0tKSB7CgkJaW50IHQ7IGNpbiA+PiB0OyAtLXQ7CgoJCWlmICh0ID09IDApIHsKCQkJaW50IGwsIHI7IGNpbiA+PiBsID4+IHI7IC0tbCwgLS1yOwoJCQlhdXRvIFtMLCBNXSA9IHNwbGl0X2J5X2Ftb3VudChULCBsKTsKCQkJYXV0byBbbSwgUl0gPSBzcGxpdF9ieV9hbW91bnQoTSwgciAtIGwgKyAxKTsKCgkJCS8vIG9idGFpbiB0aGUgdHJlYXAgZm9yIFtsLCByXQoJCQltLT5mbGlwIF49IDE7IC8vIHVwZGF0ZSBmbGlwIHZhbHVlIGZvciByb290CgoJCQkvLyByZXR1cm4gdHJlYXAgdG8gb3JpZ2luYWwgc3RhdGUKCQkJVCA9IG1lcmdlKEwsIG1lcmdlKG0sIFIpKTsKCQl9CgoJCWlmICh0ID09IDEpIHsKCQkJaW50IGwsIHI7IGNpbiA+PiBsID4+IHI7IC0tbCwgLS1yOwoJCQlhdXRvIFtMLCBNXSA9IHNwbGl0X2J5X2Ftb3VudChULCBsKTsKCQkJYXV0byBbbSwgUl0gPSBzcGxpdF9ieV9hbW91bnQoTSwgciAtIGwgKyAxKTsKCgkJCS8vIG9idGFpbiB0aGUgdHJlYXAgZm9yIFtsLCByXQoJCQljb3V0IDw8IG0tPnN1bSA8PCBubDsgLy8gb3V0cHV0IHN1bSBvZiB2YWx1ZXMgaW4gdHJlYXAKCgkJCS8vIHJldHVybiB0cmVhcCB0byBvcmlnaW5hbCBzdGF0ZQoJCQlUID0gbWVyZ2UoTCwgbWVyZ2UobSwgUikpOyAKCQl9Cgl9CQoKCglleGl0KDAtMCk7Cn0KCi8vIEJyZWF0aGUgSW4sIEJyZWF0aGUgT3V0