Problem:
MathJax.Hub.Config({ tex2jax: { inlineMath: [["$","$"], ["\\(","\\)"]], processEscapes: true }});

Transformation

Write a program which performs a sequence of commands to a given string $str$. The command is one of:

print a b: print from the a-th character to the b-th character of $str$

reverse a b: reverse from the a-th character to the b-th character of $str$

replace a b p: replace from the a-th character to the b-th character of $str$ with p

Note that the indices of $str$ start with 0.

Input

In the first line, a string $str$ is given. $str$ consists of lowercase letters. In the second line, the number of commands q is given. In the next q lines, each command is given in the above mentioned format.

Output

For each print command, print a string in a line.

Constraints

$1 \leq $ length of $str \leq 1000$

$1 \leq q \leq 100$

$0 \leq a \leq b < $ length of $str$

for replace command, $b - a + 1 = $ length of $p$

Sample Input 1

abcde
3
replace 1 3 xyz
reverse 0 2
print 1 4

Sample Output 1

xaze

Sample Input 2

xyz
3
print 0 2
replace 0 2 abc
print 0 2

Sample Output 2

xyz
abc

Solution in C# (judge verdict: Accepted)

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace ITP1_9_D
{
    class Program
    {
        static void Main(string[] args)
        {
            // 文字列strに対して与えられた命令の列を実行するプログラム
            // 命令① print a b：strのa文字目からb文字目を出力
            // 命令② reverse a b：strのa文字目からb文字目までを逆順にする
            // 命令③ replace a b p：strのa文字目からb文字目までをpに置きかえる

            // 1行目：文字列str
            // 2行目：命令の数q
            // 3～q+n行目：命令

            //問題の不備 a,bは何文字目かではなく、文字列のインデックスを示している。

            string str = Console.ReadLine();                                // 1行目を読み込み文字列をstrに取得
            int q = int.Parse(Console.ReadLine());                          // 2行目を読み込み命令の数をqに取得

            for (int i = 0; i < q; i++)                                     // 命令の数だけ以下を繰り返す
            {
                string[] cmnd = Console.ReadLine().Split(' ');              // 命令の行を取得
                int a = int.Parse(cmnd[1]);                                 
                int b = int.Parse(cmnd[2]);

                if (cmnd[0] == "print")                                     // 命令がprintだった時の処理
                {
                    Console.WriteLine(str.Substring(a, b - a + 1));
                }

                else if (cmnd[0] == "reverse")                              // 命令がreverseだった時の処理
                {
                    string str1 = str.Substring(0, a);                      // 反転しない部分前半
                    string str2 = str.Substring(a, b-a+1);                  // 反転する文字列
                    string str3 = str.Substring(b+1);                       // 反転しない部分後半
                    str2 = string.Join("", str2.Reverse());                 // str2を反転
                    str = str1 + str2 + str3;
                }

                else if (cmnd[0] == "replace")                              // 命令がreplaceだった時の処理
                {
                    string p = cmnd[3];                                     // 置き換えた後の文字列pを取得
                    string str1 = str.Substring(0, a);                      // 置きかえない部分前半
                    string str2 = str.Substring(b + 1);                     // 置きかえない部分後半
                    str = str1 + p + str2;

                    //System.Text.StringBuilder replace = new System.Text.StringBuilder(str);
                    //string strTgt = str.Substring(a, b + 1);
                    //replace.Replace(strTgt, p, a, b + 1);
                    //str = replace.ToString();
                }
            }



        }
    }
}