#include <iostream>
#include <cstdio>
#include <algorithm>
#include <vector>
#include <array>
#include <tuple>
using namespace std;
#define SZ(a) (int)(a).size()
typedef long long ll;
typedef char E;
struct nd {
typedef nd* ndp;
E e;
ndp p;
array<ndp, 2> c;
bool rev;
int sz;
E shift;
nd(E _e, ndp _p);
};
typedef nd* ndp;
ndp root;
bool isroot(ndp t) {
return t == root;
}
bool isleaf(ndp t) {
return t == NULL;
}
int getsz(ndp t) {
return isleaf(t) ? 0 : t->sz;
}
nd::nd(E _e, ndp _p) {
e = _e;
p = _p;
rev = false;
shift = 0;
}
bool ic(ndp x) {
auto y = x->p;
return x == y->c[1];
}
void apply_lazy(ndp x) {
for (auto i = 0; i < 2; i++) {
auto w = x->c[i];
if (!isleaf(w)) {
w->shift = (w->shift+x->shift)%26;
w->rev ^= x->rev;
}
}
x->e = (x->e+x->shift)%26;;
x->shift = 0;
if (x->rev) {
swap(x->c[0], x->c[1]);
x->rev = false;
}
}
void rot(ndp y, int i) {
auto z = y->p;
auto x = y->c[i];
z->c[ic(y)] = x;
x->p = z;
z = x->c[i ^ 1];
x->c[i ^ 1] = y;
y->p = x;
y->c[i] = z;
if (!isleaf(z)) {
z->p = y;
}
x->sz = y->sz;
y->sz = getsz(y->c[0])+1+getsz(y->c[1]);
}
void splay(ndp x) {
while (true) {
auto y = x->p;
if (isroot(y)) {
break;
}
auto i = ic(x);
auto z = y->p;
if (isroot(z)) {
rot(y, i);
break;
}
auto j = ic(y);
if (i == j) {
rot(z, j);
rot(y, i);
}
else {
rot(y, i);
rot(z, j);
}
}
}
void at(ndp& t, int i) {
while (true) {
apply_lazy(t);
auto szl = getsz(t->c[0]);
if (i == szl) {
break;
}
else if (i > szl) {
t = t->c[1];
i -= szl+1;
}
else {
t = t->c[0];
}
}
splay(t);
}
pair<ndp, bool> subtree(ndp& t, int l, int r) {
at(t, r);
auto x = t->c[0];
root = t;
at(x, l-1);
root = t->p;
return {x, 1};
}
ndp cut(ndp& t, int l, int r) {
ndp y;
bool b;
tie(y, b) = subtree(t, l, r);
auto x = y->c[b];
y->c[b] = NULL;
if (!isleaf(x)) {
x->p = root;
}
for (; !isroot(y); y = y->p) {
y->sz -= getsz(x);
}
return x;
}
void paste(ndp& t, int i, ndp x) {
ndp y;
bool b;
tie(y, b) = subtree(t, i, i);
y->c[b] = x;
if (!isleaf(x)) {
x->p = y;
}
for (; !isroot(y); y = y->p) {
y->sz += getsz(x);
}
}
ndp mkTree(string::iterator l, string::iterator r, ndp p, string indent = "") {
if (l == r) {
return NULL;
}
auto d = r-l;
auto m = l+d/2;
auto t = new nd(*m-'a', p);
auto indent1 = indent+" ";
t->c[0] = mkTree(l, m, t, indent1);
t->c[1] = mkTree(m+1, r, t, indent1);
t->sz = getsz(t->c[0])+1+getsz(t->c[1]);
return t;
}
string inorder(ndp t) {
if (isleaf(t)) {
return "";
}
apply_lazy(t);
return inorder(t->c[0])+(char)('a'+t->e)+inorder(t->c[1]);
}
int main() {
cin.sync_with_stdio(false);
string s;
cin >> s;
s = "a"+s+"a";
root = new nd(0, NULL);
auto t = mkTree(begin(s), end(s), root);
int nq;
cin >> nq;
for (auto iq = 0; iq < nq; iq++) {
int o;
cin >> o;
if (o == 1) {
int l, r, p;
cin >> l >> r >> p;
l--;
l++; r++; p++;
auto x = cut(t, l, r);
paste(t, p, x);
}
else if (o == 2) {
int l, r, c;
cin >> l >> r >> c;
l--;
l++; r++;
ndp y;
bool b;
tie(y, b) = subtree(t, l, r);
auto x = y->c[b];
if (!isleaf(x)) {
x->shift = (x->shift+c)%26;
}
}
else {
int l, r;
cin >> l >> r;
l--;
l++; r++;
ndp y;
bool b;
tie(y, b) = subtree(t, l, r);
auto x = y->c[b];
if (!isleaf(x)) {
x->rev = !x->rev;
}
}
}
auto ans = inorder(t);
ans = string(begin(ans)+1, end(ans)-1);
puts(ans.c_str());
return 0;
}
I2luY2x1ZGUgPGlvc3RyZWFtPgojaW5jbHVkZSA8Y3N0ZGlvPgojaW5jbHVkZSA8YWxnb3JpdGhtPgojaW5jbHVkZSA8dmVjdG9yPgojaW5jbHVkZSA8YXJyYXk+CiNpbmNsdWRlIDx0dXBsZT4KdXNpbmcgbmFtZXNwYWNlIHN0ZDsKI2RlZmluZSBTWihhKSAoaW50KShhKS5zaXplKCkKdHlwZWRlZiBsb25nIGxvbmcgbGw7CiAKdHlwZWRlZiBjaGFyIEU7CiAKc3RydWN0IG5kIHsKCXR5cGVkZWYgbmQqIG5kcDsKCUUgZTsKCW5kcCBwOwoJYXJyYXk8bmRwLCAyPiBjOwoJYm9vbCByZXY7CglpbnQgc3o7CglFIHNoaWZ0OwoJbmQoRSBfZSwgbmRwIF9wKTsKfTsKdHlwZWRlZiBuZCogbmRwOwogCm5kcCByb290OwogCmJvb2wgaXNyb290KG5kcCB0KSB7CglyZXR1cm4gdCA9PSByb290Owp9CiAKYm9vbCBpc2xlYWYobmRwIHQpIHsKCXJldHVybiB0ID09IE5VTEw7Cn0KIAppbnQgZ2V0c3oobmRwIHQpIHsKCXJldHVybiBpc2xlYWYodCkgPyAwIDogdC0+c3o7Cn0KIApuZDo6bmQoRSBfZSwgbmRwIF9wKSB7CgllID0gX2U7CglwID0gX3A7CglyZXYgPSBmYWxzZTsKCXNoaWZ0ID0gMDsKfQogCmJvb2wgaWMobmRwIHgpIHsKCWF1dG8geSA9IHgtPnA7CglyZXR1cm4geCA9PSB5LT5jWzFdOwp9CiAKdm9pZCBhcHBseV9sYXp5KG5kcCB4KSB7Cglmb3IgKGF1dG8gaSA9IDA7IGkgPCAyOyBpKyspIHsKCQlhdXRvIHcgPSB4LT5jW2ldOwoJCWlmICghaXNsZWFmKHcpKSB7CgkJCXctPnNoaWZ0ID0gKHctPnNoaWZ0K3gtPnNoaWZ0KSUyNjsKCQkJdy0+cmV2IF49IHgtPnJldjsKCQl9Cgl9Cgl4LT5lID0gKHgtPmUreC0+c2hpZnQpJTI2OzsKCXgtPnNoaWZ0ID0gMDsKCWlmICh4LT5yZXYpIHsKCQlzd2FwKHgtPmNbMF0sIHgtPmNbMV0pOwoJCXgtPnJldiA9IGZhbHNlOwoJfQp9CiAKdm9pZCByb3QobmRwIHksIGludCBpKSB7CglhdXRvIHogPSB5LT5wOwoJYXV0byB4ID0geS0+Y1tpXTsKCXotPmNbaWMoeSldID0geDsKCXgtPnAgPSB6OwoJeiA9IHgtPmNbaSBeIDFdOwoJeC0+Y1tpIF4gMV0gPSB5OwoJeS0+cCA9IHg7Cgl5LT5jW2ldID0gejsKCWlmICghaXNsZWFmKHopKSB7CgkJei0+cCA9IHk7Cgl9Cgl4LT5zeiA9IHktPnN6OwoJeS0+c3ogPSBnZXRzeih5LT5jWzBdKSsxK2dldHN6KHktPmNbMV0pOwp9CiAKdm9pZCBzcGxheShuZHAgeCkgewoJd2hpbGUgKHRydWUpIHsKCQlhdXRvIHkgPSB4LT5wOwoJCWlmIChpc3Jvb3QoeSkpIHsKCQkJYnJlYWs7CgkJfQoJCWF1dG8gaSA9IGljKHgpOwoJCWF1dG8geiA9IHktPnA7CgkJaWYgKGlzcm9vdCh6KSkgewoJCQlyb3QoeSwgaSk7CgkJCWJyZWFrOwoJCX0KCQlhdXRvIGogPSBpYyh5KTsKCQlpZiAoaSA9PSBqKSB7CgkJCXJvdCh6LCBqKTsKCQkJcm90KHksIGkpOwoJCX0KCQllbHNlIHsKCQkJcm90KHksIGkpOwoJCQlyb3Qoeiwgaik7CgkJfQoJfQp9CiAKdm9pZCBhdChuZHAmIHQsIGludCBpKSB7Cgl3aGlsZSAodHJ1ZSkgewoJCWFwcGx5X2xhenkodCk7CgkJYXV0byBzemwgPSBnZXRzeih0LT5jWzBdKTsKCQlpZiAoaSA9PSBzemwpIHsKCQkJYnJlYWs7CgkJfQoJCWVsc2UgaWYgKGkgPiBzemwpIHsKCQkJdCA9IHQtPmNbMV07CgkJCWkgLT0gc3psKzE7CgkJfQoJCWVsc2UgewoJCQl0ID0gdC0+Y1swXTsKCQl9Cgl9CglzcGxheSh0KTsKfQogCnBhaXI8bmRwLCBib29sPiBzdWJ0cmVlKG5kcCYgdCwgaW50IGwsIGludCByKSB7CglhdCh0LCByKTsKCWF1dG8geCA9IHQtPmNbMF07Cglyb290ID0gdDsKCWF0KHgsIGwtMSk7Cglyb290ID0gdC0+cDsKCXJldHVybiB7eCwgMX07Cn0KIApuZHAgY3V0KG5kcCYgdCwgaW50IGwsIGludCByKSB7CgluZHAgeTsKCWJvb2wgYjsKCXRpZSh5LCBiKSA9IHN1YnRyZWUodCwgbCwgcik7CglhdXRvIHggPSB5LT5jW2JdOwoJeS0+Y1tiXSA9IE5VTEw7CglpZiAoIWlzbGVhZih4KSkgewoJCXgtPnAgPSByb290OwoJfQoJZm9yICg7ICFpc3Jvb3QoeSk7IHkgPSB5LT5wKSB7CgkJeS0+c3ogLT0gZ2V0c3ooeCk7Cgl9CglyZXR1cm4geDsKfQogCnZvaWQgcGFzdGUobmRwJiB0LCBpbnQgaSwgbmRwIHgpIHsKCW5kcCB5OwoJYm9vbCBiOwoJdGllKHksIGIpID0gc3VidHJlZSh0LCBpLCBpKTsKCXktPmNbYl0gPSB4OwoJaWYgKCFpc2xlYWYoeCkpIHsKCQl4LT5wID0geTsKCX0KCWZvciAoOyAhaXNyb290KHkpOyB5ID0geS0+cCkgewoJCXktPnN6ICs9IGdldHN6KHgpOwoJfQp9CiAKbmRwIG1rVHJlZShzdHJpbmc6Oml0ZXJhdG9yIGwsIHN0cmluZzo6aXRlcmF0b3IgciwgbmRwIHAsIHN0cmluZyBpbmRlbnQgPSAiIikgewoJaWYgKGwgPT0gcikgewoJCXJldHVybiBOVUxMOwoJfQoJYXV0byBkID0gci1sOwoJYXV0byBtID0gbCtkLzI7CglhdXRvIHQgPSBuZXcgbmQoKm0tJ2EnLCBwKTsKCWF1dG8gaW5kZW50MSA9IGluZGVudCsiICAgICI7Cgl0LT5jWzBdID0gbWtUcmVlKGwsIG0sIHQsIGluZGVudDEpOwoJdC0+Y1sxXSA9IG1rVHJlZShtKzEsIHIsIHQsIGluZGVudDEpOwoJdC0+c3ogPSBnZXRzeih0LT5jWzBdKSsxK2dldHN6KHQtPmNbMV0pOwoJcmV0dXJuIHQ7Cn0KIApzdHJpbmcgaW5vcmRlcihuZHAgdCkgewoJaWYgKGlzbGVhZih0KSkgewoJCXJldHVybiAiIjsKCX0KCWFwcGx5X2xhenkodCk7CglyZXR1cm4gaW5vcmRlcih0LT5jWzBdKSsoY2hhcikoJ2EnK3QtPmUpK2lub3JkZXIodC0+Y1sxXSk7Cn0KIAppbnQgbWFpbigpIHsKCWNpbi5zeW5jX3dpdGhfc3RkaW8oZmFsc2UpOwoJc3RyaW5nIHM7CgljaW4gPj4gczsKCXMgPSAiYSIrcysiYSI7Cglyb290ID0gbmV3IG5kKDAsIE5VTEwpOwoJYXV0byB0ID0gbWtUcmVlKGJlZ2luKHMpLCBlbmQocyksIHJvb3QpOwoJaW50IG5xOwoJY2luID4+IG5xOwoJZm9yIChhdXRvIGlxID0gMDsgaXEgPCBucTsgaXErKykgewoJCWludCBvOwoJCWNpbiA+PiBvOwoJCWlmIChvID09IDEpIHsKCQkJaW50IGwsIHIsIHA7CgkJCWNpbiA+PiBsID4+IHIgPj4gcDsKCQkJbC0tOwoJCQlsKys7IHIrKzsgcCsrOwoJCQlhdXRvIHggPSBjdXQodCwgbCwgcik7CgkJCXBhc3RlKHQsIHAsIHgpOwoJCX0KCQllbHNlIGlmIChvID09IDIpIHsKCQkJaW50IGwsIHIsIGM7CgkJCWNpbiA+PiBsID4+IHIgPj4gYzsKCQkJbC0tOwoJCQlsKys7IHIrKzsKCQkJbmRwIHk7CgkJCWJvb2wgYjsKCQkJdGllKHksIGIpID0gc3VidHJlZSh0LCBsLCByKTsKCQkJYXV0byB4ID0geS0+Y1tiXTsKCQkJaWYgKCFpc2xlYWYoeCkpIHsKCQkJCXgtPnNoaWZ0ID0gKHgtPnNoaWZ0K2MpJTI2OwoJCQl9CgkJfQoJCWVsc2UgewoJCQlpbnQgbCwgcjsKCQkJY2luID4+IGwgPj4gcjsKCQkJbC0tOwoJCQlsKys7IHIrKzsKCQkJbmRwIHk7CgkJCWJvb2wgYjsKCQkJdGllKHksIGIpID0gc3VidHJlZSh0LCBsLCByKTsKCQkJYXV0byB4ID0geS0+Y1tiXTsKCQkJaWYgKCFpc2xlYWYoeCkpIHsKCQkJCXgtPnJldiA9ICF4LT5yZXY7CgkJCX0KCQl9Cgl9CglhdXRvIGFucyA9IGlub3JkZXIodCk7CglhbnMgPSBzdHJpbmcoYmVnaW4oYW5zKSsxLCBlbmQoYW5zKS0xKTsKCXB1dHMoYW5zLmNfc3RyKCkpOwoJcmV0dXJuIDA7Cn0KIA==