def test():
    R_in = _RQ(15, 2, 12)
    Q_in = _RQ(15, 3, 12)

    list_R2 = _R_recursion_2(R_in)
    list_R4 = _R_recursion_4(R_in)
    list_Q2 = _Q_recursion_2(Q_in)
    list_Q4 = _Q_recursion_4(Q_in)

    print_info()

    print_RQ(R_in, "R_IN")
    print_RQ(Q_in, "Q_IN")

    print("-------------------------")
    print("R")
    print("-------------------------")

    print("-------------------------")
    print("-- 1xQ")
    print_RQ(list_R2[0], "R2")
    print_RQ(list_R2[1], "Q2")
    print("-- 0xQ")
    print_RQ(list_R2[2], "R2")

    print("-------------------------")
    print("-- 3xQ")
    print_RQ(list_R4[0], "R4")
    print_RQ(list_R4[1], "Q4")
    print("-- 2xQ")
    print_RQ(list_R4[2], "R4")
    print_RQ(list_R4[3], "Q4")
    print("-- 1xQ")
    print_RQ(list_R4[4], "R4")
    print_RQ(list_R4[5], "Q4")
    print("-- 0xQ")
    print_RQ(list_R4[6], "R4")

    print("-------------------------")
    print("Q")
    print("-------------------------")

    print("-- 0xR")
    print_RQ(list_Q2[0], "Q2")
    print("-- 1xR")
    print_RQ(list_Q2[1], "Q2")
    print_RQ(list_Q2[2], "R2")

    print("-------------------------")
    print("-- 3xR")
    print_RQ(list_Q4[0], "Q4")
    print_RQ(list_Q4[1], "R4")
    print("-- 2xR")
    print_RQ(list_Q4[2], "Q4")
    print_RQ(list_Q4[3], "R4")
    print("-- 1xR")
    print_RQ(list_Q4[4], "Q4")
    print_RQ(list_Q4[5], "R4")
    print("-- 0xR")
    print_RQ(list_Q4[6], "Q4")
def _R_recursion_2(R_in):
    
    #
    # ----------------------------------------------------
    start = R_in.start
    superscript = R_in.superscript
    end = R_in.end - (R_in.start-R_in.end + 1)
    
    R_out_1 = _RQ( start, superscript, end ) 

    #
    # ----------------------------------------------------
    start = R_in.start - R_in.superscript
    superscript = R_in.start - R_in.superscript - R_in.end - 1
    end = R_in.end - R_in.superscript
    
    Q_out_1 = _RQ(start, superscript, end)
    
    #
    # ----------------------------------------------------
    start = R_in.start
    superscript = R_in.start - ( R_in.end - 1 ) + R_in.superscript
    end = R_in.end - (R_in.start-R_in.end + 1)
    
    R_out_2 = _RQ( start, superscript, end )
    
    R_out_1.name = "R2_1"
    Q_out_1.name = "Q_1"
    R_out_2.name = "R2_2"

    
    return [ R_out_1 , Q_out_1 , R_out_2]
def _Q_recursion_2(Q_in):

    #
    # ----------------------------------------------------
    start = Q_in.start
    superscript = Q_in.start - (Q_in.end - 1) + Q_in.superscript
    end = Q_in.end - (Q_in.start - Q_in.end)

    Q_out_1 = _RQ(start, superscript, end)

    # ----------------------------------------------------
    # ----------------------------------------------------
    # ----------------------------------------------------

    #
    # ----------------------------------------------------
    # start = Q_in.start
    superscript = Q_in.superscript
    # end = Q_in.end - ( Q_in.start - Q_in.end )

    Q_out_2 = _RQ(start, superscript, end)

    #
    # ----------------------------------------------------
    start = Q_in.start - Q_in.superscript
    superscript = Q_in.start - (Q_in.end - 1) - Q_in.superscript
    end = Q_in.end - Q_in.superscript

    R_out_2 = _RQ(start, superscript, end)

    return [Q_out_1, Q_out_2, R_out_2]
def _R_recursion_4(R_in):


    start0 = R_in.start
    start1 = R_in.end - 1
    start2 = R_in.end - 2 -   (R_in.start - R_in.end)
    start3 = R_in.end - 3 - 2*(R_in.start - R_in.end)
    
    end0 = R_in.end
    end1 = start2 + 1
    end2 = start3 + 1
    end3 = start3 - (R_in.start - R_in.end)
    
    
    #
    # ----------------------------------------------------
    start = start0
    superscript = R_in.superscript
    end = end3
    
    R_out_1 = _RQ( start, superscript, end )
    
    #
    # ----------------------------------------------------
    start = start0 - R_in.superscript
    superscript = start0 - R_in.superscript - start1
    end = end0 - R_in.superscript
    
    Q_out_1 = _RQ( start, superscript, end )
    
    
    # ----------------------------------------------------
    # ----------------------------------------------------
    # ----------------------------------------------------
    
    
    #
    # ----------------------------------------------------
    start = R_in.start
    superscript = start0 - start1 + R_in.superscript
    end = end3
    
    R_out_2 = _RQ( start, superscript, end )
    
    #
    # ----------------------------------------------------
    start = start1 - R_in.superscript
    superscript = start1 - R_in.superscript - start3
    end = end1 - R_in.superscript
    
    Q_out_2 = _RQ( start, superscript, end )
    
    
    # ----------------------------------------------------
    # ----------------------------------------------------
    # ----------------------------------------------------
    
    
    #
    # ----------------------------------------------------
    start = start0
    superscript = start0 - start2 + R_in.superscript
    end = end3
    
    R_out_3 = _RQ( start, superscript, end )
    
    #
    # ----------------------------------------------------
    start = start2 - R_in.superscript
    superscript = start2 - R_in.superscript - end2
    end = end1 - R_in.superscript
    
    Q_out_3 = _RQ( start, superscript, end )
    
    
    # ----------------------------------------------------
    # ----------------------------------------------------
    # ----------------------------------------------------
    
    
    #
    # ----------------------------------------------------
    start = start0
    superscript = start0 - start3 + R_in.superscript
    end = end3
    
    R_out_4 = _RQ( start, superscript, end )
    
    # ----------------------------------------------------
    # ----------------------------------------------------
    # ----------------------------------------------------
    
    R_out_1.name = "R4_1"
    Q_out_1.name = "Q_1"
    R_out_2.name = "R4_2"
    Q_out_2.name = "Q_2"
    R_out_3.name = "R4_3"
    Q_out_3.name = "Q_3"
    R_out_4.name = "R4_4"
    
    return [ R_out_1 , Q_out_1 , R_out_2 , Q_out_2 , R_out_3 , Q_out_3 , R_out_4]
    
    
    
    
    
    
    
    
    
# TEST
def print_RQ(in_RQ):
    print(in_RQ.name.ljust(5)+"{"+str(in_RQ.start)+","+str(in_RQ.superscript)+","+str(in_RQ.end)+"}")
   


R_in = _RQ( int(sys.argv[1]) , int(sys.argv[2]) , int(sys.argv[3]) )
if int(sys.argv[4]) == 4:
    # RECURSION - 4
    list_R4 = _R_recursion_4(R_in)
    for x in list_R4:
        print_RQ(x)
else:
    list_R2 = _R_recursion_2(R_in)
    for x in list_R2:
        print_RQ(x)
    
    
    
    
    
    
def _Q_recursion_4(Q_in):

    start0 = Q_in.start
    start1 = Q_in.end - 1
    start2 = Q_in.end - 2 - (Q_in.start - Q_in.end)
    start3 = Q_in.end - 3 - 2 * (Q_in.start - Q_in.end)

    end0 = Q_in.end
    end1 = start2 + 1
    end2 = start3 + 1
    end3 = start3 - (Q_in.start - Q_in.end)

    #
    # ----------------------------------------------------
    start = Q_in.start
    superscript = Q_in.superscript
    end = end3

    Q_out_1 = _RQ(start, superscript, end)

    #
    # ----------------------------------------------------
    start = start0 - Q_in.superscript
    superscript = start0 - start1 - Q_in.superscript
    end = end0 - -Q_in.superscript

    R_out_1 = _RQ(start, superscript, end)

    # ----------------------------------------------------
    # ----------------------------------------------------
    # ----------------------------------------------------

    #
    # ----------------------------------------------------
    start = Q_in.start
    superscript = start0 - start1 + Q_in.superscript
    end = end3

    Q_out_2 = _RQ(start, superscript, end)

    #
    # ----------------------------------------------------
    start = start1 - Q_in.superscript
    superscript = start1 - Q_in.superscript - start2
    end = end1 - Q_in.superscript

    R_out_2 = _RQ(start, superscript, end)

    # ----------------------------------------------------
    # ----------------------------------------------------
    # ----------------------------------------------------

    #
    # ----------------------------------------------------
    start = Q_in.start
    superscript = start0 - start2 + Q_in.superscript
    end = end3

    Q_out_3 = _RQ(start, superscript, end)

    #
    # ----------------------------------------------------
    start = start2 - Q_in.superscript
    superscript = start2 - Q_in.superscript - start3
    end = end2 - Q_in.superscript

    R_out_3 = _RQ(start, superscript, end)

    # ----------------------------------------------------
    # ----------------------------------------------------
    # ----------------------------------------------------

    #
    # ----------------------------------------------------
    start = Q_in.start
    superscript = start0 - start3 + Q_in.superscript
    end = end3

    Q_out_4 = _RQ(start, superscript, end)

    return [Q_out_1, R_out_1, Q_out_2, R_out_2, Q_out_3, R_out_3, Q_out_4]