#include <iostream>
#include <vector>
#include <algorithm>
#include <cmath>
using namespace std;
// .first = 홀수의 개수
// .second = 짝수의 개수
pair<int, int> init(vector<int>& arr, vector<pair<int, int>>& tree, int node, int start, int end) {
if (start == end) {
if (arr[start] % 2)// 홀수
return tree[node] = make_pair(1, 0);
else // 짝수
return tree[node] = make_pair(0, 1);
}
int mid = (start + end) / 2;
pair<int, int> left = init(arr, tree, node * 2, start, mid);
pair<int, int> right = init(arr, tree, node * 2 + 1, mid + 1, end);
return tree[node] = make_pair(left.first + right.first, left.second + right.second);
}
pair<int, int> query(vector<pair<int, int>>& tree, int node, int start, int end, int left, int right) {
if (right < start || end < left)
return make_pair(0, 0);
if (left <= start && end <= right)
return tree[node];
int mid = (start + end) / 2;
pair<int, int> left_child = query(tree, node * 2, start, mid, left, right);
pair<int, int> right_child = query(tree, node * 2 + 1, mid + 1, end, left, right);
return make_pair(left_child.first + right_child.first, left_child.second + right_child.second);
}
void update(vector<pair<int, int>>& tree, int node, int start, int end, int index, int val) {
if (index < start || end < index) return;
if (val % 2) { // 홀수개수 증가, 짝수 개수 감소
tree[node].first++;
tree[node].second--;
}
else { // 홀수개수 감소, 짝수 개수 증가
tree[node].first--;
tree[node].second++;
}
if (start != end) {
int mid = (start + end) / 2;
update(tree, node * 2, start, mid, index, val);
update(tree, node * 2 + 1, mid + 1, end, index, val);
}
}
int main() {
ios::sync_with_stdio(false);
cin.tie(NULL);
cout.tie(NULL);
int n; // 수열의 개수
cin >> n;
vector<int> arr(n);
for (int i = 0; i < n; i++)
cin >> arr[i];
// 트리의 크기 결정
int tree_height = (int)(ceil(log2(n)));
int tree_size = (1 << (tree_height + 1));
vector<pair<int, int>> tree(tree_size);
// .first = 홀수의 개수
// .second = 짝수의 개수
init(arr, tree, 1, 0, n - 1);
int m; // 쿼리의 개수
cin >> m;
int mode = 0;
for (int i = 0; i < m; i++) {
cin >> mode;
if (mode == 1) { // update
int index, val;
cin >> index >> val;
// 짝수 -> 짝수, 홀수 -> 홀수 는 개수 업데이트가 필요x
if (arr[index - 1] % 2 == val % 2) continue;
update(tree, 1, 0, n - 1, index - 1, val);
}
else if (mode == 2) { // 범위 내 짝수의 개수 출력
int left, right;
cin >> left >> right;
pair<int, int> res = query(tree, 1, 0, n - 1, left - 1, right - 1);
cout << res.second << "\n";
}
else if (mode == 3) { // 범위 내 홀수의 개수 출력
int left, right;
cin >> left >> right;
pair<int, int> res = query(tree, 1, 0, n - 1, left - 1, right - 1);
cout << res.first << "\n";
}
}
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8Y21hdGg+Cgp1c2luZyBuYW1lc3BhY2Ugc3RkOwoKLy8gLmZpcnN0ID0g7ZmA7IiY7J2YIOqwnOyImAovLyAuc2Vjb25kID0g7Ked7IiY7J2YIOqwnOyImAoKcGFpcjxpbnQsIGludD4gaW5pdCh2ZWN0b3I8aW50PiYgYXJyLCB2ZWN0b3I8cGFpcjxpbnQsIGludD4+JiB0cmVlLCBpbnQgbm9kZSwgaW50IHN0YXJ0LCBpbnQgZW5kKSB7CgogICBpZiAoc3RhcnQgPT0gZW5kKSB7CiAgICAgIGlmIChhcnJbc3RhcnRdICUgMikvLyDtmYDsiJgKICAgICAgICAgcmV0dXJuIHRyZWVbbm9kZV0gPSBtYWtlX3BhaXIoMSwgMCk7CiAgICAgIGVsc2UgLy8g7Ked7IiYCiAgICAgICAgIHJldHVybiB0cmVlW25vZGVdID0gbWFrZV9wYWlyKDAsIDEpOwogICB9CgogICBpbnQgbWlkID0gKHN0YXJ0ICsgZW5kKSAvIDI7CiAgIAogICBwYWlyPGludCwgaW50PiBsZWZ0ID0gaW5pdChhcnIsIHRyZWUsIG5vZGUgKiAyLCBzdGFydCwgbWlkKTsKICAgcGFpcjxpbnQsIGludD4gcmlnaHQgPSBpbml0KGFyciwgdHJlZSwgbm9kZSAqIDIgKyAxLCBtaWQgKyAxLCBlbmQpOwogICAKICAgcmV0dXJuIHRyZWVbbm9kZV0gPSBtYWtlX3BhaXIobGVmdC5maXJzdCArIHJpZ2h0LmZpcnN0LCBsZWZ0LnNlY29uZCArIHJpZ2h0LnNlY29uZCk7Cn0KCnBhaXI8aW50LCBpbnQ+IHF1ZXJ5KHZlY3RvcjxwYWlyPGludCwgaW50Pj4mIHRyZWUsIGludCBub2RlLCBpbnQgc3RhcnQsIGludCBlbmQsIGludCBsZWZ0LCBpbnQgcmlnaHQpIHsKCiAgIGlmIChyaWdodCA8IHN0YXJ0IHx8IGVuZCA8IGxlZnQpCiAgICAgIHJldHVybiBtYWtlX3BhaXIoMCwgMCk7CgogICBpZiAobGVmdCA8PSBzdGFydCAmJiBlbmQgPD0gcmlnaHQpCiAgICAgIHJldHVybiB0cmVlW25vZGVdOwoKICAgaW50IG1pZCA9IChzdGFydCArIGVuZCkgLyAyOwoKICAgcGFpcjxpbnQsIGludD4gbGVmdF9jaGlsZCA9IHF1ZXJ5KHRyZWUsIG5vZGUgKiAyLCBzdGFydCwgbWlkLCBsZWZ0LCByaWdodCk7CiAgIHBhaXI8aW50LCBpbnQ+IHJpZ2h0X2NoaWxkID0gcXVlcnkodHJlZSwgbm9kZSAqIDIgKyAxLCBtaWQgKyAxLCBlbmQsIGxlZnQsIHJpZ2h0KTsKCiAgIHJldHVybiBtYWtlX3BhaXIobGVmdF9jaGlsZC5maXJzdCArIHJpZ2h0X2NoaWxkLmZpcnN0LCBsZWZ0X2NoaWxkLnNlY29uZCArIHJpZ2h0X2NoaWxkLnNlY29uZCk7Cgp9Cgp2b2lkIHVwZGF0ZSh2ZWN0b3I8cGFpcjxpbnQsIGludD4+JiB0cmVlLCBpbnQgbm9kZSwgaW50IHN0YXJ0LCBpbnQgZW5kLCBpbnQgaW5kZXgsIGludCB2YWwpIHsKCiAgIGlmIChpbmRleCA8IHN0YXJ0IHx8IGVuZCA8IGluZGV4KSByZXR1cm47CgogICBpZiAodmFsICUgMikgeyAvLyDtmYDsiJjqsJzsiJgg7Kad6rCALCDsp53siJgg6rCc7IiYIOqwkOyGjAogICAgICB0cmVlW25vZGVdLmZpcnN0Kys7CiAgICAgIHRyZWVbbm9kZV0uc2Vjb25kLS07CiAgIH0KICAgZWxzZSB7IC8vIO2ZgOyImOqwnOyImCDqsJDshowsIOynneyImCDqsJzsiJgg7Kad6rCACiAgICAgIHRyZWVbbm9kZV0uZmlyc3QtLTsKICAgICAgdHJlZVtub2RlXS5zZWNvbmQrKzsKICAgfQoKICAgaWYgKHN0YXJ0ICE9IGVuZCkgewogICAgICBpbnQgbWlkID0gKHN0YXJ0ICsgZW5kKSAvIDI7CiAgICAgIHVwZGF0ZSh0cmVlLCBub2RlICogMiwgc3RhcnQsIG1pZCwgaW5kZXgsIHZhbCk7CiAgICAgIHVwZGF0ZSh0cmVlLCBub2RlICogMiArIDEsIG1pZCArIDEsIGVuZCwgaW5kZXgsIHZhbCk7CiAgIH0KfQoKaW50IG1haW4oKSB7CgogICBpb3M6OnN5bmNfd2l0aF9zdGRpbyhmYWxzZSk7CiAgIGNpbi50aWUoTlVMTCk7CiAgIGNvdXQudGllKE5VTEwpOwoKICAgaW50IG47IC8vIOyImOyXtOydmCDqsJzsiJgKICAgY2luID4+IG47CiAgIHZlY3RvcjxpbnQ+IGFycihuKTsKCiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbjsgaSsrKQogICAgICBjaW4gPj4gYXJyW2ldOwogICAKICAgLy8g7Yq466as7J2YIO2BrOq4sCDqsrDsoJUKICAgaW50IHRyZWVfaGVpZ2h0ID0gKGludCkoY2VpbChsb2cyKG4pKSk7CiAgIGludCB0cmVlX3NpemUgPSAoMSA8PCAodHJlZV9oZWlnaHQgKyAxKSk7CgogICB2ZWN0b3I8cGFpcjxpbnQsIGludD4+IHRyZWUodHJlZV9zaXplKTsKCiAgIC8vIC5maXJzdCA9IO2ZgOyImOydmCDqsJzsiJgKICAgLy8gLnNlY29uZCA9IOynneyImOydmCDqsJzsiJgKCiAgIGluaXQoYXJyLCB0cmVlLCAxLCAwLCBuIC0gMSk7CiAgIGludCBtOyAgIC8vIOy/vOumrOydmCDqsJzsiJgKICAgY2luID4+IG07CgogICBpbnQgbW9kZSA9IDA7CiAgIGZvciAoaW50IGkgPSAwOyBpIDwgbTsgaSsrKSB7CiAgICAgIGNpbiA+PiBtb2RlOwoKICAgICAgaWYgKG1vZGUgPT0gMSkgeyAvLyB1cGRhdGUKICAgICAgICAgaW50IGluZGV4LCB2YWw7CiAgICAgICAgIGNpbiA+PiBpbmRleCA+PiB2YWw7CgogICAgICAgICAvLyDsp53siJggLT4g7Ked7IiYLCDtmYDsiJggLT4g7ZmA7IiYIOuKlCDqsJzsiJgg7JeF642w7J207Yq46rCAIO2VhOyalHgKICAgICAgICAgaWYgKGFycltpbmRleCAtIDFdICUgMiA9PSB2YWwgJSAyKSBjb250aW51ZTsKCiAgICAgICAgIHVwZGF0ZSh0cmVlLCAxLCAwLCBuIC0gMSwgaW5kZXggLSAxLCB2YWwpOwogICAgICB9CgogICAgICBlbHNlIGlmIChtb2RlID09IDIpIHsgLy8g67KU7JyEIOuCtCDsp53siJjsnZgg6rCc7IiYIOy2nOugpQogICAgICAgICBpbnQgbGVmdCwgcmlnaHQ7CiAgICAgICAgIGNpbiA+PiBsZWZ0ID4+IHJpZ2h0OwogICAgICAgICBwYWlyPGludCwgaW50PiByZXMgPSBxdWVyeSh0cmVlLCAxLCAwLCBuIC0gMSwgbGVmdCAtIDEsIHJpZ2h0IC0gMSk7CiAgICAgICAgIGNvdXQgPDwgcmVzLnNlY29uZCA8PCAiXG4iOwogICAgICB9CgogICAgICBlbHNlIGlmIChtb2RlID09IDMpIHsgLy8g67KU7JyEIOuCtCDtmYDsiJjsnZgg6rCc7IiYIOy2nOugpQogICAgICAgICBpbnQgbGVmdCwgcmlnaHQ7CiAgICAgICAgIGNpbiA+PiBsZWZ0ID4+IHJpZ2h0OwogICAgICAgICBwYWlyPGludCwgaW50PiByZXMgPSBxdWVyeSh0cmVlLCAxLCAwLCBuIC0gMSwgbGVmdCAtIDEsIHJpZ2h0IC0gMSk7CiAgICAgICAgIGNvdXQgPDwgcmVzLmZpcnN0IDw8ICJcbiI7CgogICAgICB9CiAgIH0KCiAgIHJldHVybiAwOwp9