#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;
}