Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <utility>
- using std::cin;
- using std::cout;
- using std::max;
- using std::min;
- using std::pair;
- using std::vector;
- vector<int> Mas;
- vector<int> Add_Mas;
- void push(int vert, int vl_bnd, int vr_bnd) {
- if (vl_bnd != vr_bnd) {
- Add_Mas[ 2 * vert + 1 ] += Add_Mas[ vert ];
- Add_Mas[ 2 * vert + 2 ] += Add_Mas[ vert ];
- }
- Mas[ vert ] += Add_Mas[ vert ];
- Add_Mas[ vert ] = 0;
- }
- void build(int vert, int vl_bnd, int vr_bnd, vector<int>& mas_in) {
- if (vl_bnd == vr_bnd) {
- Mas[ vert ] = mas_in[ vl_bnd ];
- return;
- }
- int mid = vl_bnd + (vr_bnd - vl_bnd) / 2;
- build(2 * vert + 1, vl_bnd, mid, mas_in);
- build(2 * vert + 2, mid + 1, vr_bnd, mas_in);
- Mas[ vert ] = max(Mas[ 2 * vert + 1 ], Mas[ 2 * vert + 2 ]);
- }
- int query(int vert, int vl_bnd, int vr_bnd, int left, int right) {
- push(vert, vl_bnd, vr_bnd);
- if (right < vl_bnd || vr_bnd < left)
- return 0;
- if (left <= vl_bnd && vr_bnd <= right)
- return Mas[ vert ];
- int mid = vl_bnd + (vr_bnd - vl_bnd) / 2;
- int query_l = query(2 * vert + 1, vl_bnd, mid, left, right);
- int query_r = query(2 * vert + 2, mid + 1, vr_bnd, left, right);
- return max(query_l, query_r);
- }
- void modify(int vert, int vl_bnd, int vr_bnd, int left, int right, int val) {
- push(vert, vl_bnd, vr_bnd);
- if (right < vl_bnd || vr_bnd < left) {
- return;
- }
- if (left <= vl_bnd && vr_bnd <= right) {
- Add_Mas[ vert ] = val;
- push(vert, vl_bnd, vr_bnd);
- return;
- }
- int mid = vl_bnd + (vr_bnd - vl_bnd) / 2;
- modify(2 * vert + 1, vl_bnd, mid, left, right, val);
- modify(2 * vert + 2, mid + 1, vr_bnd, left, right, val);
- Mas[ vert ] = max(Mas[ 2 * vert + 1 ], Mas[ 2 * vert + 2 ]);
- }
- int main() {
- int cnt;
- cin >> cnt;
- int pow = 1;
- while (pow < cnt) {
- pow <<= 1;
- }
- Mas.resize(pow * 2, 0);
- Add_Mas.resize(pow * 2, 0);
- vector<int> tempio(pow, 0);
- for (int i = 0; i < cnt; ++i) {
- cin >> tempio[ i ];
- }
- build(0, 0, pow - 1, tempio);
- int req = 0;
- cin >> req;
- for (int iter = 0; iter < req; ++iter) {
- char todo;
- cin >> todo;
- if (todo == 'm') {
- int lft, rht;
- cin >> lft >> rht;
- cout << query(0, 0, pow - 1, lft - 1, rht - 1) << " ";
- } else {
- int lft, rht, val;
- cin >> lft >> rht >> val;
- modify(0, 0, pow - 1, lft - 1, rht - 1, val);
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement