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 JAVA (judge verdict: Accepted)

import java.util.Scanner;

enum Order{
	print,
	reverse,
	replace
};

class Main {
  public static void main(String args[]) {
	Scanner scanner = new Scanner(System.in);
	String  inp = scanner.next();
  	String order;
  	Order  change;
  	int num = scanner.nextInt();
  	int count = 0;
  	boolean Judge = true;
  	
  	//change = Order.print;
  	change = null;
  	
  	while( Judge ){
  		order = scanner.next();

  		//命令判別
  		if( order.equals("print") ) {
  			change = Order.print;
  		}
  		if( order.equals("reverse") ) {
  			change = Order.reverse;
  		}
  		if( order.equals("replace") ) {
  			change = Order.replace;
  		}
  		
  		//命令ごとに処理
  		if( change != null ) {
	  		switch(change) {
	  		case print:
	  			print(inp,scanner);
	  			break;
	  		case reverse:
	  			inp = reverse(inp,scanner);
	  			break;
	  		case replace:
	  			inp = replace(inp,scanner);
	  		}
  		}
  		
  		count ++;
  		if(count >= num) {
  			Judge = false;
  			break;
  		}
  			
  	}
  	
	
  	//後処理
	scanner.close();
  }
  
  public static void print( String inpData ,Scanner scanner){
		int sta = scanner.nextInt();
		int end = scanner.nextInt();
		
  		String substr = inpData.substring(sta, end + 1);
		//出力
		System.out.println(substr);
  }
  
  public static String reverse( String inpData ,Scanner scanner){
		int sta = scanner.nextInt();
		int end = scanner.nextInt();
  		//入れ替え
  		String substr = inpData.substring(sta, end + 1);
		StringBuffer sb = new StringBuffer(substr);
  		String repstr = sb.reverse().toString();
		inpData = inpData.replaceFirst(substr, repstr);
		
		return inpData;
  }
  
  public static String replace( String inpData , Scanner scanner){
		int sta = scanner.nextInt();
		int end = scanner.nextInt();
		
		String rep = scanner.next();
		//置換
		StringBuilder stb = new StringBuilder(inpData);
		StringBuilder repstr = stb.replace(sta, end + 1 , rep );
		String str = new String(repstr);
		//inpData = inpData.substring(sta, end + 1).replace(substr, rep);
		inpData = str;
		
		return inpData;
  }
  
}