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 ConsoleApplication2
{
    class Program
    {
        static void Main(string[] args)
        {
            
            //文字列と命令数の入力読取。
            string strWord = Console.ReadLine();
            string strNum = Console.ReadLine();
            int intNum = int.Parse(strNum);
            
            //命令の入力を読み取り、処理。
            for(int order = 0; order < intNum; order++){
                string strOrder =Console.ReadLine();
                Transformation insT = new Transformation(strWord, strOrder);
                strWord = insT.GetWord();
            }
            
        }
        
    }
    
    class Transformation{
        
        private string strWord;
        private string strOrder;
        
        public Transformation(string strWord, string strOrder){
            this.strWord = strWord;
            this.strOrder = strOrder;
            Judge();
        }
        
        private void Judge(){
        
            //命令の詳細をそれぞれ変数に格納。
            string[] orderArray = strOrder.Split(' ');
            string strOperation = orderArray[0];
            string strStart = orderArray[1];
            int intStart = int.Parse(strStart);
            string strEnd = orderArray[2];
            int intEnd = int.Parse(strEnd);

            //文字列操作。            
            char[] chWord = strWord.ToCharArray();
            if(strOperation == "print"){
                for(int index = intStart; index <= intEnd; index++){
                    Console.Write(chWord[index]);
                }
                Console.WriteLine();
            }else if(strOperation == "reverse"){
                //int intReverseEnd = (intEnd - intStart) / 2;
                for(int index = intStart; index <= intEnd; index++){
                    char chTemp = chWord[index];
                    chWord[index] = chWord[intEnd];
                    chWord[intEnd] = chTemp;
                    intEnd--;
                }
                strWord = "";
                for(int index = 0; index < chWord.Length; index++){
                    strWord += chWord[index].ToString();
                }
            }else{
                char[] chReplace = orderArray[3].ToCharArray();
                int intForEnd = intEnd - intStart;
                for(int index = 0; index <= intForEnd; index++){
                    chWord[intStart + index] = chReplace[index];
                }
                strWord = "";
                for(int index = 0; index < chWord.Length; index++){
                    strWord += chWord[index].ToString();
                }
            }
            
        }
        
        public string GetWord(){
            return strWord;
        }
        
    }

}