Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<iostream>
- #include<vector>
- #include<limits.h>
- #include<algorithm>
- using namespace std;
- int getMax(int left, int right, vector<int> &maxA) {
- left += maxA.size() >> 1;
- right += maxA.size() >> 1;
- int ans = 0;
- while (left <= right) {
- cout << left << " " << right << "\n";
- if ((left % 2) != 0) {
- ans = ans + maxA[left];
- left++;
- }
- if ((right % 2) == 0) {
- ans = ans + maxA[right];
- right--;
- }
- left >>= 1;
- right >>= 1;
- }
- return ans;
- }
- void setValue(int i, int value, vector<int> &maxA) {
- i += maxA.size() >> 1;
- maxA[i] = value;
- i >>= 1;
- while (i > 0) {
- maxA[i] = maxA[i << 1] + maxA[(i << 1) + 1];
- i >>= 1;
- }
- }
- main() {
- int n;
- cin >> n;
- vector<int> maxA(2 * n);
- for (int i = n; i < 2 * n; i++)cin >> maxA[i];
- for (int i = n - 1; i >= 1; i--)maxA[i] = maxA[i << 1] + maxA[(i << 1) + 1];
- for (int i = 0; i < 2 * n; ++i) {
- cout << maxA[i] << " ";
- }
- cout << "\n";
- bool first = true;
- int m;
- cin >> m;
- for (int q = 0; q < m; q++) {
- char cmd;
- scanf(" %c", &cmd);
- if (cmd == 's') {
- int left, right;
- cin >> left >> right;
- left--;
- right--;
- if (first)first = false;
- else printf(" ");
- cout << getMax(left, right, maxA);
- } else if (cmd == 'u') {
- int pos, value;
- cin >> pos >> value;
- pos--;
- setValue(pos, value, maxA);
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment