#include <bits/stdc++.h>
using namespace std;

int main() {
    ios::sync_with_stdio(false);
    cin.tie(nullptr);

    int n, m;
    cin >> n >> m;

    int n2 = 1;
    while (n2 < n) {
        n2 *= 2;
    }

    vector<pair<int, int>> v(2 * n2);

    // Liście
    for (int i = n2; i < 2 * n2; i++) {
        v[i].first = 0;
        v[i].second = -i;
    }

    // Wczytanie wartości
    for (int i = n2; i < n2 + n; i++) {
        cin >> v[i].first;
        v[i].second = -i;
    }

    // Budowanie drzewa
    for (int i = n2 - 1; i > 0; i--) {
        v[i].first = max(v[2 * i].first, v[2 * i + 1].first);

        if (v[2 * i].first >= v[2 * i + 1].first) {
            v[i].second = v[2 * i].second;
        } else {
            v[i].second = v[2 * i + 1].second;
        }
    }

    for (int i = 0; i < m; i++) {
        string x;
        cin >> x;

        if (x == "PIORUN") {
            int a, b, c;
            cin >> a >> b >> c;

            a = a + n2 - 1;
            b = b + n2 - 1;

            int d = INT_MIN;
            int e = INT_MIN;

            // Szukanie maksimum na przedziale [a,b]
            while (a <= b) {
                if (a % 2 == 1) {
                    if (v[a].first > d) {
                        d = v[a].first;
                        e = v[a].second;
                    } else if (v[a].first == d) {
                        e = max(e, v[a].second);
                    }
                    a++;
                }

                if (b % 2 == 0) {
                    if (v[b].first > d) {
                        d = v[b].first;
                        e = v[b].second;
                    } else if (v[b].first == d) {
                        e = max(e, v[b].second);
                    }
                    b--;
                }

                a /= 2;
                b /= 2;
            }

            // e przechowuje ujemny indeks liścia
            int pos = -e;

            // Zmniejszenie wartości o c, ale nie poniżej 0
            v[pos].first = max(v[pos].first - c, 0);

            // Odbudowanie drzewa
            int p = pos / 2;

            while (p > 0) {
                v[p].first = max(v[2 * p].first, v[2 * p + 1].first);

                if (v[2 * p].first >= v[2 * p + 1].first) {
                    v[p].second = v[2 * p].second;
                } else {
                    v[p].second = v[2 * p + 1].second;
                }

                p /= 2;
            }

            // Twój sposób wypisywania drzewa
            int z = 2;

            for (int j = 1; j < 2 * n2; j++) {
                if (j >= z) {
                    cout << '\n';
                    z *= 2;
                }

                cout << v[j].first << " ";
            }

            cout << '\n';

            // Pozycja w tablicy wejściowej + nowa wartość
            cout << pos - n2 + 1 << " " << v[pos].first << '\n';
        }

        else if (x == "WZROST") {
            int a, b;
            cin >> a >> b;

            a = a + n2 - 1;

            // Zwiększenie wartości
            v[a].first += b;

            // Odbudowanie drzewa
            int p = a / 2;

            while (p > 0) {
                v[p].first = max(v[2 * p].first, v[2 * p + 1].first);

                if (v[2 * p].first >= v[2 * p + 1].first) {
                    v[p].second = v[2 * p].second;
                } else {
                    v[p].second = v[2 * p + 1].second;
                }

                p /= 2;
            }

            // Twój sposób wypisywania drzewa
            int z = 2;

            for (int j = 1; j < 2 * n2; j++) {
                if (j >= z) {
                    cout << '\n';
                    z *= 2;
                }

                cout << v[j].first << " ";
            }

            cout << '\n';
            cout << v[a].first << '\n';
        }
    }

    return 0;
}