Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <cmath>
- #include <algorithm>
- using namespace std;
- long long a[10000000];
- long long tree1[40000004];
- long long tree2[40000004];
- long long get_max(long long l, long long r, long long v, long long tl, long long tr) {
- if (l <= tl && tr <= r) {
- return tree2[v];
- }
- if (tr < l || r < tl) {
- return 0;
- }
- long long tm = (tl + tr) / 2;
- return max(get_max(l, r, v * 2, tl, tm), get_max(l, r, v * 2 + 1, tm + 1, tr));
- }
- //для нахождения суммы
- void build_tree(long long v, long long tl, long long tr) {
- if (tl == tr) {
- tree1[v] = a[tl];
- tree2[v] = a[tl];
- }
- else {
- int tm = (tl + tr) / 2;
- build_tree(v * 2, tl, tm);
- build_tree(v * 2 + 1, tm + 1, tr);
- tree1[v] = tree1[v * 2] + tree1[v * 2 + 1];
- tree2[v] = max(tree2[v * 2], tree2[v * 2 + 1]);
- }
- }
- long long get_sum(long long l, long long r, long long v, long long tl, long long tr) {
- if (l <= tl && tr <= r) {
- return tree1[v];
- }
- if (tr < l || r < tl) {
- return 0;
- }
- long long tm = (tl + tr) / 2;
- return get_sum(l, r, v * 2, tl, tm)
- + get_sum(l, r, v * 2 + 1, tm + 1, tr);
- }
- int main() {
- ios_base::sync_with_stdio(false);
- cin.tie(0);
- long long T;
- cin >> T;
- for (int smth = 0; smth < T; smth++) {
- long long n, m;
- cin >> n >> m;
- //считывание
- for (int i = 0; i < n; i++)
- cin >> a[i];
- //построение дерева
- build_tree(1, 0, n - 1);
- //обработка событий
- for (int e = 0; e < m; e++) {
- long long x, y;
- char ch;
- cin >> ch >> x >> y;
- if (ch == 111) {
- long long t;
- cin >> t;
- for (int i = (x-1); i <= (y-1); i++) {
- a[i] = min(a[i], t);
- }
- build_tree(1, 0, n - 1);
- }
- else if (ch == 109) {
- cout << get_max(x-1, y-1, 1, 0, n - 1) << "\n";
- }
- else {
- cout << get_sum(x-1, y-1, 1, 0, n - 1) << "\n";
- }
- }
- }
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement