Problem 473

Phigital number base — sum of palindromic phigitals <= 10^10. Meet-in-the-middle over paired exponents (stbrumme gap of 3).

Answer35856681704365
Output35856681704365
StatusPASS
Native helperno
Runtime0 ms
Peak memory2032 KB
Time complexityO(n log n) (estimated)
Space complexityO(n^2) (estimated)

Performance comparison

MetricOur solutionBest known
Time complexityO(n log n)O(n^2)
Space complexityO(n^2)O(1)
ApproachFlow solutionBrute-force or constructive search
VerdictOptimal

Flow source

# Project Euler 473
# Phigital number base — sum of palindromic phigitals <= 10^10.
# Meet-in-the-middle over paired exponents (stbrumme gap of 3).

extern {
    function calloc(n: i64, size: i64) -> ptr<void>
    function free(p: ptr<void>) -> void
}

let mut PX: ptr<i64> = null
let mut PY: ptr<i64> = null

let mut LX: ptr<i64> = null
let mut LY: ptr<i64> = null
let mut LLAST: ptr<i64> = null
let mut LN: i64 = 0

let mut RX: ptr<i64> = null
let mut RY: ptr<i64> = null
let mut RFIRST: ptr<i64> = null
let mut RN: i64 = 0

function gen_left(x: i64, y: i64, ni: i64, last: i64, hi: i64) -> void {
    LX[LN] = x
    LY[LN] = y
    LLAST[LN] = last
    LN = LN + 1
    let mut e: i64 = ni
    while e <= hi {
        gen_left(x + PX[e], y + PY[e], e + 3, e, hi)
        e = e + 1
    }
}

function gen_right(x: i64, y: i64, ni: i64, first: i64, hi: i64) -> void {
    RX[RN] = x
    RY[RN] = y
    RFIRST[RN] = first
    RN = RN + 1
    let mut e: i64 = ni
    while e <= hi {
        gen_right(x + PX[e], y + PY[e], e + 3, first, hi)
        e = e + 1
    }
}

function sort_right_by_y() -> void {
    # quicksort triples (RY, RX, RFIRST) by RY then RFIRST
    let lo: ptr<i64> = calloc(64, 8)
    let hi: ptr<i64> = calloc(64, 8)
    let mut sp: i32 = 0
    lo[0] = 0
    hi[0] = RN - 1
    sp = 1
    while sp > 0 {
        sp = sp - 1
        let l: i64 = lo[sp]
        let h: i64 = hi[sp]
        if l >= h { continue }
        let mid: i64 = (l + h) / 2
        let py: i64 = RY[mid]
        let pf: i64 = RFIRST[mid]
        let mut i: i64 = l
        let mut j: i64 = h
        while i <= j {
            while true {
                let mut less: bool = false
                if RY[i] < py { less = true }
                else {
                    if RY[i] == py {
                        if RFIRST[i] < pf { less = true }
                    }
                }
                if !less { break }
                i = i + 1
            }
            while true {
                let mut greater: bool = false
                if RY[j] > py { greater = true }
                else {
                    if RY[j] == py {
                        if RFIRST[j] > pf { greater = true }
                    }
                }
                if !greater { break }
                j = j - 1
            }
            if i <= j {
                let tx: i64 = RX[i]; RX[i] = RX[j]; RX[j] = tx
                let ty: i64 = RY[i]; RY[i] = RY[j]; RY[j] = ty
                let tf: i64 = RFIRST[i]; RFIRST[i] = RFIRST[j]; RFIRST[j] = tf
                i = i + 1
                j = j - 1
            }
        }
        if l < j {
            lo[sp] = l
            hi[sp] = j
            sp = sp + 1
        }
        if i < h {
            lo[sp] = i
            hi[sp] = h
            sp = sp + 1
        }
    }
    free(lo)
    free(hi)
}

function main() -> i32 {
    let LIMIT: i64 = 10000000000
    PX = calloc(50, 8)
    PY = calloc(50, 8)
    let F: ptr<i64> = calloc(60, 8)
    if PX == null || PY == null || F == null { return 1 }

    F[0] = 0
    F[1] = 1
    let mut i: i64 = 2
    while i < 60 {
        F[i] = F[i - 1] + F[i - 2]
        i = i + 1
    }

    PX[0] = 2
    PY[0] = 0
    i = 1
    while i <= 48 {
        let Lk: i64 = F[i - 1] + F[i + 1]
        let Lk1: i64 = F[i] + F[i + 2]
        let mut sign: i64 = 0 - 1
        if ((i + 1) & 1) == 0 {
            sign = 1
        }
        PX[i] = Lk + sign * Lk1
        PY[i] = F[i] - sign * F[i + 1]
        i = i + 1
    }

    # ~13k states per half
    let CAP: i64 = 20000
    LX = calloc(CAP, 8)
    LY = calloc(CAP, 8)
    LLAST = calloc(CAP, 8)
    RX = calloc(CAP, 8)
    RY = calloc(CAP, 8)
    RFIRST = calloc(CAP, 8)
    if LX == null || LY == null || LLAST == null || RX == null || RY == null || RFIRST == null {
        return 1
    }

    # empty left
    LX[0] = 0
    LY[0] = 0
    LLAST[0] = 0 - 1000000000
    LN = 1
    i = 1
    while i <= 24 {
        gen_left(PX[i], PY[i], i + 3, i, 24)
        i = i + 1
    }

    # empty right
    RX[0] = 0
    RY[0] = 0
    RFIRST[0] = 1000000000
    RN = 1
    i = 25
    while i <= 48 {
        gen_right(PX[i], PY[i], i + 3, i, 48)
        i = i + 1
    }

    sort_right_by_y()

    let mut ans: i64 = 0
    let mut li: i64 = 0
    while li < LN {
        let need: i64 = 0 - LY[li]
        let last: i64 = LLAST[li]
        # binary search lower bound on RY == need
        let mut lo: i64 = 0
        let mut hi: i64 = RN
        while lo < hi {
            let mid: i64 = (lo + hi) / 2
            if RY[mid] < need {
                lo = mid + 1
            } else {
                hi = mid
            }
        }
        let mut ri: i64 = lo
        while ri < RN {
            if RY[ri] != need { break }
            if RFIRST[ri] >= last + 3 {
                let xx: i64 = LX[li] + RX[ri]
                let v: i64 = xx / 2
                if v > 0 {
                    if v <= LIMIT {
                        ans = ans + v
                    }
                }
            }
            ri = ri + 1
        }
        li = li + 1
    }

    # Lone phigital "1"
    printf("%lld\n", ans + 1)

    free(PX)
    free(PY)
    free(F)
    free(LX)
    free(LY)
    free(LLAST)
    free(RX)
    free(RY)
    free(RFIRST)
    return 0
}

Generated C

#include <stdint.h>
#include <stdbool.h>
#include <stdio.h>
#include <stdlib.h>
#include <string.h>

/* Flow runtime helpers */
typedef struct flow_temp_node { struct flow_temp_node* next; } flow_temp_node;
static flow_temp_node* flow_temp_head = NULL;
static int flow_temp_atexit_set = 0;
__attribute__((unused)) static void flow_temp_free_all(void) {
    while (flow_temp_head) {
        flow_temp_node* n = flow_temp_head;
        flow_temp_head = n->next;
        free(n);
    }
}
__attribute__((unused)) static void* flow_temp_alloc(size_t nbytes) {
    flow_temp_node* node = (flow_temp_node*)malloc(sizeof(flow_temp_node) + nbytes);
    if (!node) return NULL;
    node->next = flow_temp_head;
    flow_temp_head = node;
    if (!flow_temp_atexit_set) {
        flow_temp_atexit_set = 1;
        atexit(flow_temp_free_all);
    }
    return (void*)(node + 1);
}
#ifndef FLOW_DIAG
#define FLOW_DIAG(msg) fprintf(stderr, "%s", (msg))
#endif
#ifndef FLOW_LOG
#define FLOW_LOG(fmt, ...) printf(fmt, __VA_ARGS__)
#endif
#ifndef FLOW_LOG_EMPTY
#define FLOW_LOG_EMPTY(fmt) printf(fmt)
#endif
static char* flow_strcat(const char* a, const char* b) {
    size_t la = strlen(a ? a : ""), lb = strlen(b ? b : "");
    char* r = (char*)flow_temp_alloc(la + lb + 1);
    if (!r) return NULL;
    if (la) memcpy(r, a, la);
    if (lb) memcpy(r + la, b, lb);
    r[la + lb] = '\0';
    return r;
}

#define __flow_in_arr(arr, val) __extension__ ({ \
    int _found = 0; \
    size_t _n = sizeof(arr)/sizeof((arr)[0]); \
    for (size_t _i = 0; _i < _n; _i++) { \
        if ((arr)[_i] == (val)) { _found = 1; break; } \
    } _found; })

/* Unified fault handler (MISRA #279) — override with -DFLOW_FAULT_HANDLER=fn */
#ifndef FLOW_FAULT_HANDLER
__attribute__((unused)) static inline void flow_fault_handler(const char* msg) {
    fprintf(stderr, "flow: %s\n", msg ? msg : "fault");
    abort();
#if defined(__GNUC__) || defined(__clang__)
    __builtin_unreachable();
#endif
}
#else
#define flow_fault_handler FLOW_FAULT_HANDLER
#endif
#define flow_div_by_zero_handler() flow_fault_handler("division by zero")
#define flow_shift_ub_handler() flow_fault_handler("invalid shift (amount out of range or left-shift of negative)")

#ifndef FLOW_CHECKED_DIV
#define FLOW_CHECKED_DIV(L, R) (((R) != 0) ? ((L) / (R)) : (flow_div_by_zero_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_MOD
#define FLOW_CHECKED_MOD(L, R) (((R) != 0) ? ((L) % (R)) : (flow_div_by_zero_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_SHL
#define FLOW_CHECKED_SHL(L, R) ((((R) >= 0) && ((unsigned long long)(R) < (sizeof(L) * 8ull)) && ((L) >= 0)) ? ((L) << (R)) : (flow_shift_ub_handler(), (L) * 0))
#endif
#ifndef FLOW_CHECKED_SHR
#define FLOW_CHECKED_SHR(L, R) ((((R) >= 0) && ((unsigned long long)(R) < (sizeof(L) * 8ull))) ? ((L) >> (R)) : (flow_shift_ub_handler(), (L) * 0))
#endif

#include <math.h>

void* _ui_state = NULL;

static inline float i32_to_f32(int32_t v) { return (float)v; }

/* Host stub for @gpu kernels (device codegen replaces this). */
static inline int32_t gpu_thread_id(void) { return 0; }

void gen_left_i64_i64_i64_i64_i64(int64_t x, int64_t y, int64_t ni, int64_t last, int64_t hi);
void gen_right_i64_i64_i64_i64_i64(int64_t x, int64_t y, int64_t ni, int64_t first, int64_t hi);
void sort_right_by_y(void);
int32_t main(void);

/* Module statics */
static int64_t* PX = NULL;
static int64_t* PY = NULL;
static int64_t* LX = NULL;
static int64_t* LY = NULL;
static int64_t* LLAST = NULL;
static int64_t LN = 0;
static int64_t* RX = NULL;
static int64_t* RY = NULL;
static int64_t* RFIRST = NULL;
static int64_t RN = 0;



void gen_left_i64_i64_i64_i64_i64(int64_t x, int64_t y, int64_t ni, int64_t last, int64_t hi) {
    LX[LN] = x;
    LY[LN] = y;
    LLAST[LN] = last;
    LN = (LN + 1);
    int64_t e = ni;
    while (e <= hi) {
        gen_left_i64_i64_i64_i64_i64((x + PX[e]), (y + PY[e]), (e + 3), e, hi);
        e = (e + 1);
    }
}

void gen_right_i64_i64_i64_i64_i64(int64_t x, int64_t y, int64_t ni, int64_t first, int64_t hi) {
    RX[RN] = x;
    RY[RN] = y;
    RFIRST[RN] = first;
    RN = (RN + 1);
    int64_t e = ni;
    while (e <= hi) {
        gen_right_i64_i64_i64_i64_i64((x + PX[e]), (y + PY[e]), (e + 3), first, hi);
        e = (e + 1);
    }
}

void sort_right_by_y(void) {
    int64_t* lo = (int64_t*)(calloc(64, 8));
    int64_t* hi = (int64_t*)(calloc(64, 8));
    int32_t sp = 0;
    lo[0] = 0;
    hi[0] = (RN - 1);
    sp = 1;
    while (sp > 0) {
        sp = (sp - 1);
        int64_t l = lo[sp];
        int64_t h = hi[sp];
        if (l >= h) {
            continue;
        }
        int64_t mid = FLOW_CHECKED_DIV(((l + h)), (2));
        int64_t py = RY[mid];
        int64_t pf = RFIRST[mid];
        int64_t i = l;
        int64_t j = h;
        while (i <= j) {
            while (1) {
                bool less = 0;
                if (RY[i] < py) {
                    less = 1;
                } else {
                    if (RY[i] == py) {
                        if (RFIRST[i] < pf) {
                            less = 1;
                        }
                    }
                }
                if ((!(less))) {
                    break;
                }
                i = (i + 1);
            }
            while (1) {
                bool greater = 0;
                if (RY[j] > py) {
                    greater = 1;
                } else {
                    if (RY[j] == py) {
                        if (RFIRST[j] > pf) {
                            greater = 1;
                        }
                    }
                }
                if ((!(greater))) {
                    break;
                }
                j = (j - 1);
            }
            if (i <= j) {
                int64_t tx = RX[i];
                RX[i] = RX[j];
                RX[j] = tx;
                int64_t ty = RY[i];
                RY[i] = RY[j];
                RY[j] = ty;
                int64_t tf = RFIRST[i];
                RFIRST[i] = RFIRST[j];
                RFIRST[j] = tf;
                i = (i + 1);
                j = (j - 1);
            }
        }
        if (l < j) {
            lo[sp] = l;
            hi[sp] = j;
            sp = (sp + 1);
        }
        if (i < h) {
            lo[sp] = i;
            hi[sp] = h;
            sp = (sp + 1);
        }
    }
    free(lo);
    free(hi);
}

int32_t main(void) {
    int64_t LIMIT = 10000000000;
    PX = calloc(50, 8);
    PY = calloc(50, 8);
    int64_t* F = (int64_t*)(calloc(60, 8));
    if (((PX == NULL || PY == NULL) || F == NULL)) {
        return 1;
    }
    F[0] = 0;
    F[1] = 1;
    int64_t i = 2;
    while (i < 60) {
        F[i] = (F[(i - 1)] + F[(i - 2)]);
        i = (i + 1);
    }
    PX[0] = 2;
    PY[0] = 0;
    i = 1;
    while (i <= 48) {
        int64_t Lk = (F[(i - 1)] + F[(i + 1)]);
        int64_t Lk1 = (F[i] + F[(i + 2)]);
        int64_t sign = (0 - 1);
        if (((i + 1) & 1) == 0) {
            sign = 1;
        }
        PX[i] = (Lk + (sign * Lk1));
        PY[i] = (F[i] - (sign * F[(i + 1)]));
        i = (i + 1);
    }
    int64_t CAP = 20000;
    LX = calloc(CAP, 8);
    LY = calloc(CAP, 8);
    LLAST = calloc(CAP, 8);
    RX = calloc(CAP, 8);
    RY = calloc(CAP, 8);
    RFIRST = calloc(CAP, 8);
    if ((((((LX == NULL || LY == NULL) || LLAST == NULL) || RX == NULL) || RY == NULL) || RFIRST == NULL)) {
        return 1;
    }
    LX[0] = 0;
    LY[0] = 0;
    LLAST[0] = (0 - 1000000000);
    LN = 1;
    i = 1;
    while (i <= 24) {
        gen_left_i64_i64_i64_i64_i64(PX[i], PY[i], (i + 3), i, 24);
        i = (i + 1);
    }
    RX[0] = 0;
    RY[0] = 0;
    RFIRST[0] = 1000000000;
    RN = 1;
    i = 25;
    while (i <= 48) {
        gen_right_i64_i64_i64_i64_i64(PX[i], PY[i], (i + 3), i, 48);
        i = (i + 1);
    }
    sort_right_by_y();
    int64_t ans = 0;
    int64_t li = 0;
    while (li < LN) {
        int64_t need = (0 - LY[li]);
        int64_t last = LLAST[li];
        int64_t lo = 0;
        int64_t hi = RN;
        while (lo < hi) {
            int64_t mid = FLOW_CHECKED_DIV(((lo + hi)), (2));
            if (RY[mid] < need) {
                lo = (mid + 1);
            } else {
                hi = mid;
            }
        }
        int64_t ri = lo;
        while (ri < RN) {
            if (RY[ri] != need) {
                break;
            }
            if (RFIRST[ri] >= (last + 3)) {
                int64_t xx = (LX[li] + RX[ri]);
                int64_t v = FLOW_CHECKED_DIV((xx), (2));
                if (v > 0) {
                    if (v <= LIMIT) {
                        ans = (ans + v);
                    }
                }
            }
            ri = (ri + 1);
        }
        li = (li + 1);
    }
    printf("%lld\n", (ans + 1));
    free(PX);
    free(PY);
    free(F);
    free(LX);
    free(LY);
    free(LLAST);
    free(RX);
    free(RY);
    free(RFIRST);
    return 0;
}

Generated MLIR

module {
  llvm.func @printf(!llvm.ptr, ...) -> i32
  llvm.mlir.global internal constant @str_0("%lld\n\00") {addr_space = 0 : i32} : !llvm.array<6 x i8>
  func.func private @calloc(i64, i64) -> !llvm.ptr
  func.func private @free(!llvm.ptr) -> ()
  // Module static: PX
  llvm.mlir.global internal @PX() {addr_space = 0 : i32} : !llvm.ptr {
    %0 = llvm.mlir.zero : !llvm.ptr
    llvm.return %0 : !llvm.ptr
  }
  // Module static: PY
  llvm.mlir.global internal @PY() {addr_space = 0 : i32} : !llvm.ptr {
    %1 = llvm.mlir.zero : !llvm.ptr
    llvm.return %1 : !llvm.ptr
  }
  // Module static: LX
  llvm.mlir.global internal @LX() {addr_space = 0 : i32} : !llvm.ptr {
    %2 = llvm.mlir.zero : !llvm.ptr
    llvm.return %2 : !llvm.ptr
  }
  // Module static: LY
  llvm.mlir.global internal @LY() {addr_space = 0 : i32} : !llvm.ptr {
    %3 = llvm.mlir.zero : !llvm.ptr
    llvm.return %3 : !llvm.ptr
  }
  // Module static: LLAST
  llvm.mlir.global internal @LLAST() {addr_space = 0 : i32} : !llvm.ptr {
    %4 = llvm.mlir.zero : !llvm.ptr
    llvm.return %4 : !llvm.ptr
  }
  // Module static: LN
  llvm.mlir.global internal @LN(0 : i64) : i64
  // Module static: RX
  llvm.mlir.global internal @RX() {addr_space = 0 : i32} : !llvm.ptr {
    %5 = llvm.mlir.zero : !llvm.ptr
    llvm.return %5 : !llvm.ptr
  }
  // Module static: RY
  llvm.mlir.global internal @RY() {addr_space = 0 : i32} : !llvm.ptr {
    %6 = llvm.mlir.zero : !llvm.ptr
    llvm.return %6 : !llvm.ptr
  }
  // Module static: RFIRST
  llvm.mlir.global internal @RFIRST() {addr_space = 0 : i32} : !llvm.ptr {
    %7 = llvm.mlir.zero : !llvm.ptr
    llvm.return %7 : !llvm.ptr
  }
  // Module static: RN
  llvm.mlir.global internal @RN(0 : i64) : i64
  func.func @gen_left(%arg0: i64, %arg1: i64, %arg2: i64, %arg3: i64, %arg4: i64) -> () {
    %8 = llvm.mlir.addressof @LX : !llvm.ptr
    %9 = llvm.load %8 : !llvm.ptr -> !llvm.ptr
    %10 = llvm.mlir.addressof @LN : !llvm.ptr
    %11 = llvm.load %10 : !llvm.ptr -> i64
    %12 = llvm.getelementptr %9[%11] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %arg0, %12 : i64, !llvm.ptr
    %13 = llvm.mlir.addressof @LY : !llvm.ptr
    %14 = llvm.load %13 : !llvm.ptr -> !llvm.ptr
    %15 = llvm.mlir.addressof @LN : !llvm.ptr
    %16 = llvm.load %15 : !llvm.ptr -> i64
    %17 = llvm.getelementptr %14[%16] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %arg1, %17 : i64, !llvm.ptr
    %18 = llvm.mlir.addressof @LLAST : !llvm.ptr
    %19 = llvm.load %18 : !llvm.ptr -> !llvm.ptr
    %20 = llvm.mlir.addressof @LN : !llvm.ptr
    %21 = llvm.load %20 : !llvm.ptr -> i64
    %22 = llvm.getelementptr %19[%21] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %arg3, %22 : i64, !llvm.ptr
    %23 = llvm.mlir.addressof @LN : !llvm.ptr
    %24 = llvm.load %23 : !llvm.ptr -> i64
    %25 = arith.constant 1 : i32
    %27 = arith.extsi %25 : i32 to i64
    %26 = arith.addi %24, %27 : i64
    %28 = llvm.mlir.addressof @LN : !llvm.ptr
    llvm.store %26, %28 : i64, !llvm.ptr
    %29 = llvm.mlir.constant(1 : i64) : i64
    %30 = llvm.alloca %29 x i64 : (i64) -> !llvm.ptr
    llvm.store %arg2, %30 : i64, !llvm.ptr
    cf.br ^bb0
    ^bb0:
    %31 = llvm.load %30 : !llvm.ptr -> i64
    %32 = arith.cmpi sle, %31, %arg4 : i64
    cf.cond_br %32, ^bb1, ^bb2
    ^bb1:
      %35 = llvm.mlir.addressof @PX : !llvm.ptr
      %36 = llvm.load %35 : !llvm.ptr -> !llvm.ptr
      %37 = llvm.load %30 : !llvm.ptr -> i64
      %38 = llvm.getelementptr %36[%37] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %34 = llvm.load %38 : !llvm.ptr -> i64
      %39 = arith.addi %arg0, %34 : i64
      %41 = llvm.mlir.addressof @PY : !llvm.ptr
      %42 = llvm.load %41 : !llvm.ptr -> !llvm.ptr
      %43 = llvm.load %30 : !llvm.ptr -> i64
      %44 = llvm.getelementptr %42[%43] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %40 = llvm.load %44 : !llvm.ptr -> i64
      %45 = arith.addi %arg1, %40 : i64
      %46 = llvm.load %30 : !llvm.ptr -> i64
      %47 = arith.constant 3 : i32
      %49 = arith.extsi %47 : i32 to i64
      %48 = arith.addi %46, %49 : i64
      %50 = llvm.load %30 : !llvm.ptr -> i64
      func.call @gen_left(%39, %45, %48, %50, %arg4) : (i64, i64, i64, i64, i64) -> ()
      %51 = llvm.load %30 : !llvm.ptr -> i64
      %52 = arith.constant 1 : i32
      %54 = arith.extsi %52 : i32 to i64
      %53 = arith.addi %51, %54 : i64
      llvm.store %53, %30 : i64, !llvm.ptr
      cf.br ^bb0
    ^bb2:
    func.return
  }
  func.func @gen_right(%arg0: i64, %arg1: i64, %arg2: i64, %arg3: i64, %arg4: i64) -> () {
    %55 = llvm.mlir.addressof @RX : !llvm.ptr
    %56 = llvm.load %55 : !llvm.ptr -> !llvm.ptr
    %57 = llvm.mlir.addressof @RN : !llvm.ptr
    %58 = llvm.load %57 : !llvm.ptr -> i64
    %59 = llvm.getelementptr %56[%58] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %arg0, %59 : i64, !llvm.ptr
    %60 = llvm.mlir.addressof @RY : !llvm.ptr
    %61 = llvm.load %60 : !llvm.ptr -> !llvm.ptr
    %62 = llvm.mlir.addressof @RN : !llvm.ptr
    %63 = llvm.load %62 : !llvm.ptr -> i64
    %64 = llvm.getelementptr %61[%63] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %arg1, %64 : i64, !llvm.ptr
    %65 = llvm.mlir.addressof @RFIRST : !llvm.ptr
    %66 = llvm.load %65 : !llvm.ptr -> !llvm.ptr
    %67 = llvm.mlir.addressof @RN : !llvm.ptr
    %68 = llvm.load %67 : !llvm.ptr -> i64
    %69 = llvm.getelementptr %66[%68] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %arg3, %69 : i64, !llvm.ptr
    %70 = llvm.mlir.addressof @RN : !llvm.ptr
    %71 = llvm.load %70 : !llvm.ptr -> i64
    %72 = arith.constant 1 : i32
    %74 = arith.extsi %72 : i32 to i64
    %73 = arith.addi %71, %74 : i64
    %75 = llvm.mlir.addressof @RN : !llvm.ptr
    llvm.store %73, %75 : i64, !llvm.ptr
    %76 = llvm.mlir.constant(1 : i64) : i64
    %77 = llvm.alloca %76 x i64 : (i64) -> !llvm.ptr
    llvm.store %arg2, %77 : i64, !llvm.ptr
    cf.br ^bb3
    ^bb3:
    %78 = llvm.load %77 : !llvm.ptr -> i64
    %79 = arith.cmpi sle, %78, %arg4 : i64
    cf.cond_br %79, ^bb4, ^bb5
    ^bb4:
      %82 = llvm.mlir.addressof @PX : !llvm.ptr
      %83 = llvm.load %82 : !llvm.ptr -> !llvm.ptr
      %84 = llvm.load %77 : !llvm.ptr -> i64
      %85 = llvm.getelementptr %83[%84] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %81 = llvm.load %85 : !llvm.ptr -> i64
      %86 = arith.addi %arg0, %81 : i64
      %88 = llvm.mlir.addressof @PY : !llvm.ptr
      %89 = llvm.load %88 : !llvm.ptr -> !llvm.ptr
      %90 = llvm.load %77 : !llvm.ptr -> i64
      %91 = llvm.getelementptr %89[%90] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %87 = llvm.load %91 : !llvm.ptr -> i64
      %92 = arith.addi %arg1, %87 : i64
      %93 = llvm.load %77 : !llvm.ptr -> i64
      %94 = arith.constant 3 : i32
      %96 = arith.extsi %94 : i32 to i64
      %95 = arith.addi %93, %96 : i64
      func.call @gen_right(%86, %92, %95, %arg3, %arg4) : (i64, i64, i64, i64, i64) -> ()
      %97 = llvm.load %77 : !llvm.ptr -> i64
      %98 = arith.constant 1 : i32
      %100 = arith.extsi %98 : i32 to i64
      %99 = arith.addi %97, %100 : i64
      llvm.store %99, %77 : i64, !llvm.ptr
      cf.br ^bb3
    ^bb5:
    func.return
  }
  func.func @sort_right_by_y() -> () {
    %102 = arith.constant 64 : i32
    %103 = arith.constant 8 : i32
    %104 = arith.extsi %102 : i32 to i64
    %105 = arith.extsi %103 : i32 to i64
    %101 = func.call @calloc(%104, %105) : (i64, i64) -> !llvm.ptr
    %107 = arith.constant 64 : i32
    %108 = arith.constant 8 : i32
    %109 = arith.extsi %107 : i32 to i64
    %110 = arith.extsi %108 : i32 to i64
    %106 = func.call @calloc(%109, %110) : (i64, i64) -> !llvm.ptr
    %111 = arith.constant 0 : i32
    %112 = llvm.mlir.constant(1 : i64) : i64
    %113 = llvm.alloca %112 x i32 : (i64) -> !llvm.ptr
    llvm.store %111, %113 : i32, !llvm.ptr
    %114 = arith.constant 0 : i32
    %115 = arith.constant 0 : i32
    %116 = arith.extsi %114 : i32 to i64
    %117 = arith.extsi %115 : i32 to i64
    %118 = llvm.getelementptr %101[%117] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %116, %118 : i64, !llvm.ptr
    %119 = llvm.mlir.addressof @RN : !llvm.ptr
    %120 = llvm.load %119 : !llvm.ptr -> i64
    %121 = arith.constant 1 : i32
    %123 = arith.extsi %121 : i32 to i64
    %122 = arith.subi %120, %123 : i64
    %124 = arith.constant 0 : i32
    %125 = arith.extsi %124 : i32 to i64
    %126 = llvm.getelementptr %106[%125] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %122, %126 : i64, !llvm.ptr
    %127 = arith.constant 1 : i32
    llvm.store %127, %113 : i32, !llvm.ptr
    cf.br ^bb6
    ^bb6:
    %128 = llvm.load %113 : !llvm.ptr -> i32
    %129 = arith.constant 0 : i32
    %130 = arith.cmpi sgt, %128, %129 : i32
    cf.cond_br %130, ^bb7, ^bb8
    ^bb7:
      %131 = llvm.load %113 : !llvm.ptr -> i32
      %132 = arith.constant 1 : i32
      %133 = arith.subi %131, %132 : i32
      llvm.store %133, %113 : i32, !llvm.ptr
      %135 = llvm.load %113 : !llvm.ptr -> i32
      %136 = arith.extsi %135 : i32 to i64
      %137 = llvm.getelementptr %101[%136] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %134 = llvm.load %137 : !llvm.ptr -> i64
      %139 = llvm.load %113 : !llvm.ptr -> i32
      %140 = arith.extsi %139 : i32 to i64
      %141 = llvm.getelementptr %106[%140] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %138 = llvm.load %141 : !llvm.ptr -> i64
      %142 = arith.cmpi sge, %134, %138 : i64
      cf.cond_br %142, ^bb9, ^bb10
      ^bb9:
        cf.br ^bb6
      ^bb10:
        cf.br ^bb11
      ^bb11:
      %143 = arith.addi %134, %138 : i64
      %144 = arith.constant 2 : i32
      %146 = arith.extsi %144 : i32 to i64
      %145 = arith.divsi %143, %146 : i64
      %148 = llvm.mlir.addressof @RY : !llvm.ptr
      %149 = llvm.load %148 : !llvm.ptr -> !llvm.ptr
      %150 = llvm.getelementptr %149[%145] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %147 = llvm.load %150 : !llvm.ptr -> i64
      %152 = llvm.mlir.addressof @RFIRST : !llvm.ptr
      %153 = llvm.load %152 : !llvm.ptr -> !llvm.ptr
      %154 = llvm.getelementptr %153[%145] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %151 = llvm.load %154 : !llvm.ptr -> i64
      %155 = llvm.mlir.constant(1 : i64) : i64
      %156 = llvm.alloca %155 x i64 : (i64) -> !llvm.ptr
      llvm.store %134, %156 : i64, !llvm.ptr
      %157 = llvm.mlir.constant(1 : i64) : i64
      %158 = llvm.alloca %157 x i64 : (i64) -> !llvm.ptr
      llvm.store %138, %158 : i64, !llvm.ptr
      cf.br ^bb12
      ^bb12:
      %159 = llvm.load %156 : !llvm.ptr -> i64
      %160 = llvm.load %158 : !llvm.ptr -> i64
      %161 = arith.cmpi sle, %159, %160 : i64
      cf.cond_br %161, ^bb13, ^bb14
      ^bb13:
        cf.br ^bb15
        ^bb15:
        %162 = arith.constant 1 : i1
        cf.cond_br %162, ^bb16, ^bb17
        ^bb16:
          %163 = arith.constant 0 : i1
          %164 = llvm.mlir.constant(1 : i64) : i64
          %165 = llvm.alloca %164 x i1 : (i64) -> !llvm.ptr
          llvm.store %163, %165 : i1, !llvm.ptr
          %167 = llvm.mlir.addressof @RY : !llvm.ptr
          %168 = llvm.load %167 : !llvm.ptr -> !llvm.ptr
          %169 = llvm.load %156 : !llvm.ptr -> i64
          %170 = llvm.getelementptr %168[%169] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %166 = llvm.load %170 : !llvm.ptr -> i64
          %171 = arith.cmpi slt, %166, %147 : i64
          cf.cond_br %171, ^bb18, ^bb19
          ^bb18:
            %172 = arith.constant 1 : i1
            llvm.store %172, %165 : i1, !llvm.ptr
            cf.br ^bb20
          ^bb19:
            %174 = llvm.mlir.addressof @RY : !llvm.ptr
            %175 = llvm.load %174 : !llvm.ptr -> !llvm.ptr
            %176 = llvm.load %156 : !llvm.ptr -> i64
            %177 = llvm.getelementptr %175[%176] : (!llvm.ptr, i64) -> !llvm.ptr, i64
            %173 = llvm.load %177 : !llvm.ptr -> i64
            %178 = arith.cmpi eq, %173, %147 : i64
            cf.cond_br %178, ^bb21, ^bb22
            ^bb21:
              %180 = llvm.mlir.addressof @RFIRST : !llvm.ptr
              %181 = llvm.load %180 : !llvm.ptr -> !llvm.ptr
              %182 = llvm.load %156 : !llvm.ptr -> i64
              %183 = llvm.getelementptr %181[%182] : (!llvm.ptr, i64) -> !llvm.ptr, i64
              %179 = llvm.load %183 : !llvm.ptr -> i64
              %184 = arith.cmpi slt, %179, %151 : i64
              cf.cond_br %184, ^bb24, ^bb25
              ^bb24:
                %185 = arith.constant 1 : i1
                llvm.store %185, %165 : i1, !llvm.ptr
                cf.br ^bb26
              ^bb25:
                cf.br ^bb26
              ^bb26:
              cf.br ^bb23
            ^bb22:
              cf.br ^bb23
            ^bb23:
            cf.br ^bb20
          ^bb20:
          %186 = llvm.load %165 : !llvm.ptr -> i1
          %188 = arith.constant 1 : i1
          %187 = arith.xori %186, %188 : i1
          cf.cond_br %187, ^bb27, ^bb28
          ^bb27:
            cf.br ^bb17
          ^bb28:
            cf.br ^bb29
          ^bb29:
          %190 = llvm.load %156 : !llvm.ptr -> i64
          %191 = arith.constant 1 : i32
          %193 = arith.extsi %191 : i32 to i64
          %192 = arith.addi %190, %193 : i64
          llvm.store %192, %156 : i64, !llvm.ptr
          cf.br ^bb15
        ^bb17:
        cf.br ^bb30
        ^bb30:
        %194 = arith.constant 1 : i1
        cf.cond_br %194, ^bb31, ^bb32
        ^bb31:
          %195 = arith.constant 0 : i1
          %196 = llvm.mlir.constant(1 : i64) : i64
          %197 = llvm.alloca %196 x i1 : (i64) -> !llvm.ptr
          llvm.store %195, %197 : i1, !llvm.ptr
          %199 = llvm.mlir.addressof @RY : !llvm.ptr
          %200 = llvm.load %199 : !llvm.ptr -> !llvm.ptr
          %201 = llvm.load %158 : !llvm.ptr -> i64
          %202 = llvm.getelementptr %200[%201] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %198 = llvm.load %202 : !llvm.ptr -> i64
          %203 = arith.cmpi sgt, %198, %147 : i64
          cf.cond_br %203, ^bb33, ^bb34
          ^bb33:
            %204 = arith.constant 1 : i1
            llvm.store %204, %197 : i1, !llvm.ptr
            cf.br ^bb35
          ^bb34:
            %206 = llvm.mlir.addressof @RY : !llvm.ptr
            %207 = llvm.load %206 : !llvm.ptr -> !llvm.ptr
            %208 = llvm.load %158 : !llvm.ptr -> i64
            %209 = llvm.getelementptr %207[%208] : (!llvm.ptr, i64) -> !llvm.ptr, i64
            %205 = llvm.load %209 : !llvm.ptr -> i64
            %210 = arith.cmpi eq, %205, %147 : i64
            cf.cond_br %210, ^bb36, ^bb37
            ^bb36:
              %212 = llvm.mlir.addressof @RFIRST : !llvm.ptr
              %213 = llvm.load %212 : !llvm.ptr -> !llvm.ptr
              %214 = llvm.load %158 : !llvm.ptr -> i64
              %215 = llvm.getelementptr %213[%214] : (!llvm.ptr, i64) -> !llvm.ptr, i64
              %211 = llvm.load %215 : !llvm.ptr -> i64
              %216 = arith.cmpi sgt, %211, %151 : i64
              cf.cond_br %216, ^bb39, ^bb40
              ^bb39:
                %217 = arith.constant 1 : i1
                llvm.store %217, %197 : i1, !llvm.ptr
                cf.br ^bb41
              ^bb40:
                cf.br ^bb41
              ^bb41:
              cf.br ^bb38
            ^bb37:
              cf.br ^bb38
            ^bb38:
            cf.br ^bb35
          ^bb35:
          %218 = llvm.load %197 : !llvm.ptr -> i1
          %220 = arith.constant 1 : i1
          %219 = arith.xori %218, %220 : i1
          cf.cond_br %219, ^bb42, ^bb43
          ^bb42:
            cf.br ^bb32
          ^bb43:
            cf.br ^bb44
          ^bb44:
          %222 = llvm.load %158 : !llvm.ptr -> i64
          %223 = arith.constant 1 : i32
          %225 = arith.extsi %223 : i32 to i64
          %224 = arith.subi %222, %225 : i64
          llvm.store %224, %158 : i64, !llvm.ptr
          cf.br ^bb30
        ^bb32:
        %226 = llvm.load %156 : !llvm.ptr -> i64
        %227 = llvm.load %158 : !llvm.ptr -> i64
        %228 = arith.cmpi sle, %226, %227 : i64
        cf.cond_br %228, ^bb45, ^bb46
        ^bb45:
          %230 = llvm.mlir.addressof @RX : !llvm.ptr
          %231 = llvm.load %230 : !llvm.ptr -> !llvm.ptr
          %232 = llvm.load %156 : !llvm.ptr -> i64
          %233 = llvm.getelementptr %231[%232] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %229 = llvm.load %233 : !llvm.ptr -> i64
          %235 = llvm.mlir.addressof @RX : !llvm.ptr
          %236 = llvm.load %235 : !llvm.ptr -> !llvm.ptr
          %237 = llvm.load %158 : !llvm.ptr -> i64
          %238 = llvm.getelementptr %236[%237] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %234 = llvm.load %238 : !llvm.ptr -> i64
          %239 = llvm.mlir.addressof @RX : !llvm.ptr
          %240 = llvm.load %239 : !llvm.ptr -> !llvm.ptr
          %241 = llvm.load %156 : !llvm.ptr -> i64
          %242 = llvm.getelementptr %240[%241] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          llvm.store %234, %242 : i64, !llvm.ptr
          %243 = llvm.mlir.addressof @RX : !llvm.ptr
          %244 = llvm.load %243 : !llvm.ptr -> !llvm.ptr
          %245 = llvm.load %158 : !llvm.ptr -> i64
          %246 = llvm.getelementptr %244[%245] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          llvm.store %229, %246 : i64, !llvm.ptr
          %248 = llvm.mlir.addressof @RY : !llvm.ptr
          %249 = llvm.load %248 : !llvm.ptr -> !llvm.ptr
          %250 = llvm.load %156 : !llvm.ptr -> i64
          %251 = llvm.getelementptr %249[%250] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %247 = llvm.load %251 : !llvm.ptr -> i64
          %253 = llvm.mlir.addressof @RY : !llvm.ptr
          %254 = llvm.load %253 : !llvm.ptr -> !llvm.ptr
          %255 = llvm.load %158 : !llvm.ptr -> i64
          %256 = llvm.getelementptr %254[%255] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %252 = llvm.load %256 : !llvm.ptr -> i64
          %257 = llvm.mlir.addressof @RY : !llvm.ptr
          %258 = llvm.load %257 : !llvm.ptr -> !llvm.ptr
          %259 = llvm.load %156 : !llvm.ptr -> i64
          %260 = llvm.getelementptr %258[%259] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          llvm.store %252, %260 : i64, !llvm.ptr
          %261 = llvm.mlir.addressof @RY : !llvm.ptr
          %262 = llvm.load %261 : !llvm.ptr -> !llvm.ptr
          %263 = llvm.load %158 : !llvm.ptr -> i64
          %264 = llvm.getelementptr %262[%263] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          llvm.store %247, %264 : i64, !llvm.ptr
          %266 = llvm.mlir.addressof @RFIRST : !llvm.ptr
          %267 = llvm.load %266 : !llvm.ptr -> !llvm.ptr
          %268 = llvm.load %156 : !llvm.ptr -> i64
          %269 = llvm.getelementptr %267[%268] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %265 = llvm.load %269 : !llvm.ptr -> i64
          %271 = llvm.mlir.addressof @RFIRST : !llvm.ptr
          %272 = llvm.load %271 : !llvm.ptr -> !llvm.ptr
          %273 = llvm.load %158 : !llvm.ptr -> i64
          %274 = llvm.getelementptr %272[%273] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %270 = llvm.load %274 : !llvm.ptr -> i64
          %275 = llvm.mlir.addressof @RFIRST : !llvm.ptr
          %276 = llvm.load %275 : !llvm.ptr -> !llvm.ptr
          %277 = llvm.load %156 : !llvm.ptr -> i64
          %278 = llvm.getelementptr %276[%277] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          llvm.store %270, %278 : i64, !llvm.ptr
          %279 = llvm.mlir.addressof @RFIRST : !llvm.ptr
          %280 = llvm.load %279 : !llvm.ptr -> !llvm.ptr
          %281 = llvm.load %158 : !llvm.ptr -> i64
          %282 = llvm.getelementptr %280[%281] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          llvm.store %265, %282 : i64, !llvm.ptr
          %283 = llvm.load %156 : !llvm.ptr -> i64
          %284 = arith.constant 1 : i32
          %286 = arith.extsi %284 : i32 to i64
          %285 = arith.addi %283, %286 : i64
          llvm.store %285, %156 : i64, !llvm.ptr
          %287 = llvm.load %158 : !llvm.ptr -> i64
          %288 = arith.constant 1 : i32
          %290 = arith.extsi %288 : i32 to i64
          %289 = arith.subi %287, %290 : i64
          llvm.store %289, %158 : i64, !llvm.ptr
          cf.br ^bb47
        ^bb46:
          cf.br ^bb47
        ^bb47:
        cf.br ^bb12
      ^bb14:
      %291 = llvm.load %158 : !llvm.ptr -> i64
      %292 = arith.cmpi slt, %134, %291 : i64
      cf.cond_br %292, ^bb48, ^bb49
      ^bb48:
        %293 = llvm.load %113 : !llvm.ptr -> i32
        %294 = arith.extsi %293 : i32 to i64
        %295 = llvm.getelementptr %101[%294] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        llvm.store %134, %295 : i64, !llvm.ptr
        %296 = llvm.load %158 : !llvm.ptr -> i64
        %297 = llvm.load %113 : !llvm.ptr -> i32
        %298 = arith.extsi %297 : i32 to i64
        %299 = llvm.getelementptr %106[%298] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        llvm.store %296, %299 : i64, !llvm.ptr
        %300 = llvm.load %113 : !llvm.ptr -> i32
        %301 = arith.constant 1 : i32
        %302 = arith.addi %300, %301 : i32
        llvm.store %302, %113 : i32, !llvm.ptr
        cf.br ^bb50
      ^bb49:
        cf.br ^bb50
      ^bb50:
      %303 = llvm.load %156 : !llvm.ptr -> i64
      %304 = arith.cmpi slt, %303, %138 : i64
      cf.cond_br %304, ^bb51, ^bb52
      ^bb51:
        %305 = llvm.load %156 : !llvm.ptr -> i64
        %306 = llvm.load %113 : !llvm.ptr -> i32
        %307 = arith.extsi %306 : i32 to i64
        %308 = llvm.getelementptr %101[%307] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        llvm.store %305, %308 : i64, !llvm.ptr
        %309 = llvm.load %113 : !llvm.ptr -> i32
        %310 = arith.extsi %309 : i32 to i64
        %311 = llvm.getelementptr %106[%310] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        llvm.store %138, %311 : i64, !llvm.ptr
        %312 = llvm.load %113 : !llvm.ptr -> i32
        %313 = arith.constant 1 : i32
        %314 = arith.addi %312, %313 : i32
        llvm.store %314, %113 : i32, !llvm.ptr
        cf.br ^bb53
      ^bb52:
        cf.br ^bb53
      ^bb53:
      cf.br ^bb6
    ^bb8:
    func.call @free(%101) : (!llvm.ptr) -> ()
    func.call @free(%106) : (!llvm.ptr) -> ()
    func.return
  }
  func.func @main() -> i32 {
    %317 = arith.constant 5705032704 : i32
    %318 = arith.extsi %317 : i32 to i64
    %320 = arith.constant 50 : i32
    %321 = arith.constant 8 : i32
    %322 = arith.extsi %320 : i32 to i64
    %323 = arith.extsi %321 : i32 to i64
    %319 = func.call @calloc(%322, %323) : (i64, i64) -> !llvm.ptr
    %324 = llvm.mlir.addressof @PX : !llvm.ptr
    llvm.store %319, %324 : !llvm.ptr, !llvm.ptr
    %326 = arith.constant 50 : i32
    %327 = arith.constant 8 : i32
    %328 = arith.extsi %326 : i32 to i64
    %329 = arith.extsi %327 : i32 to i64
    %325 = func.call @calloc(%328, %329) : (i64, i64) -> !llvm.ptr
    %330 = llvm.mlir.addressof @PY : !llvm.ptr
    llvm.store %325, %330 : !llvm.ptr, !llvm.ptr
    %332 = arith.constant 60 : i32
    %333 = arith.constant 8 : i32
    %334 = arith.extsi %332 : i32 to i64
    %335 = arith.extsi %333 : i32 to i64
    %331 = func.call @calloc(%334, %335) : (i64, i64) -> !llvm.ptr
    %336 = llvm.mlir.addressof @PX : !llvm.ptr
    %337 = llvm.load %336 : !llvm.ptr -> !llvm.ptr
    %338 = llvm.mlir.zero : !llvm.ptr
    %339 = llvm.icmp "eq" %337, %338 : !llvm.ptr
    %340 = scf.if %339 -> (i1) {
      %341 = arith.constant true
      scf.yield %341 : i1
    } else {
      %342 = llvm.mlir.addressof @PY : !llvm.ptr
      %343 = llvm.load %342 : !llvm.ptr -> !llvm.ptr
      %344 = llvm.mlir.zero : !llvm.ptr
      %345 = llvm.icmp "eq" %343, %344 : !llvm.ptr
      scf.yield %345 : i1
    }
    %346 = scf.if %340 -> (i1) {
      %347 = arith.constant true
      scf.yield %347 : i1
    } else {
      %348 = llvm.mlir.zero : !llvm.ptr
      %349 = llvm.icmp "eq" %331, %348 : !llvm.ptr
      scf.yield %349 : i1
    }
    cf.cond_br %346, ^bb54, ^bb55
    ^bb54:
      %350 = arith.constant 1 : i32
      func.return %350 : i32
    ^bb55:
      cf.br ^bb56
    ^bb56:
    %351 = arith.constant 0 : i32
    %352 = arith.constant 0 : i32
    %353 = arith.extsi %351 : i32 to i64
    %354 = arith.extsi %352 : i32 to i64
    %355 = llvm.getelementptr %331[%354] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %353, %355 : i64, !llvm.ptr
    %356 = arith.constant 1 : i32
    %357 = arith.constant 1 : i32
    %358 = arith.extsi %356 : i32 to i64
    %359 = arith.extsi %357 : i32 to i64
    %360 = llvm.getelementptr %331[%359] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %358, %360 : i64, !llvm.ptr
    %361 = arith.constant 2 : i32
    %362 = arith.extsi %361 : i32 to i64
    %363 = llvm.mlir.constant(1 : i64) : i64
    %364 = llvm.alloca %363 x i64 : (i64) -> !llvm.ptr
    llvm.store %362, %364 : i64, !llvm.ptr
    cf.br ^bb57
    ^bb57:
    %365 = llvm.load %364 : !llvm.ptr -> i64
    %366 = arith.constant 60 : i32
    %368 = arith.extsi %366 : i32 to i64
    %367 = arith.cmpi slt, %365, %368 : i64
    cf.cond_br %367, ^bb58, ^bb59
    ^bb58:
      %370 = llvm.load %364 : !llvm.ptr -> i64
      %371 = arith.constant 1 : i32
      %373 = arith.extsi %371 : i32 to i64
      %372 = arith.subi %370, %373 : i64
      %374 = llvm.getelementptr %331[%372] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %369 = llvm.load %374 : !llvm.ptr -> i64
      %376 = llvm.load %364 : !llvm.ptr -> i64
      %377 = arith.constant 2 : i32
      %379 = arith.extsi %377 : i32 to i64
      %378 = arith.subi %376, %379 : i64
      %380 = llvm.getelementptr %331[%378] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %375 = llvm.load %380 : !llvm.ptr -> i64
      %381 = arith.addi %369, %375 : i64
      %382 = llvm.load %364 : !llvm.ptr -> i64
      %383 = llvm.getelementptr %331[%382] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %381, %383 : i64, !llvm.ptr
      %384 = llvm.load %364 : !llvm.ptr -> i64
      %385 = arith.constant 1 : i32
      %387 = arith.extsi %385 : i32 to i64
      %386 = arith.addi %384, %387 : i64
      llvm.store %386, %364 : i64, !llvm.ptr
      cf.br ^bb57
    ^bb59:
    %388 = arith.constant 2 : i32
    %389 = llvm.mlir.addressof @PX : !llvm.ptr
    %390 = llvm.load %389 : !llvm.ptr -> !llvm.ptr
    %391 = arith.constant 0 : i32
    %392 = arith.extsi %388 : i32 to i64
    %393 = arith.extsi %391 : i32 to i64
    %394 = llvm.getelementptr %390[%393] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %392, %394 : i64, !llvm.ptr
    %395 = arith.constant 0 : i32
    %396 = llvm.mlir.addressof @PY : !llvm.ptr
    %397 = llvm.load %396 : !llvm.ptr -> !llvm.ptr
    %398 = arith.constant 0 : i32
    %399 = arith.extsi %395 : i32 to i64
    %400 = arith.extsi %398 : i32 to i64
    %401 = llvm.getelementptr %397[%400] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %399, %401 : i64, !llvm.ptr
    %402 = arith.constant 1 : i32
    %403 = arith.extsi %402 : i32 to i64
    llvm.store %403, %364 : i64, !llvm.ptr
    cf.br ^bb60
    ^bb60:
    %404 = llvm.load %364 : !llvm.ptr -> i64
    %405 = arith.constant 48 : i32
    %407 = arith.extsi %405 : i32 to i64
    %406 = arith.cmpi sle, %404, %407 : i64
    cf.cond_br %406, ^bb61, ^bb62
    ^bb61:
      %409 = llvm.load %364 : !llvm.ptr -> i64
      %410 = arith.constant 1 : i32
      %412 = arith.extsi %410 : i32 to i64
      %411 = arith.subi %409, %412 : i64
      %413 = llvm.getelementptr %331[%411] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %408 = llvm.load %413 : !llvm.ptr -> i64
      %415 = llvm.load %364 : !llvm.ptr -> i64
      %416 = arith.constant 1 : i32
      %418 = arith.extsi %416 : i32 to i64
      %417 = arith.addi %415, %418 : i64
      %419 = llvm.getelementptr %331[%417] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %414 = llvm.load %419 : !llvm.ptr -> i64
      %420 = arith.addi %408, %414 : i64
      %422 = llvm.load %364 : !llvm.ptr -> i64
      %423 = llvm.getelementptr %331[%422] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %421 = llvm.load %423 : !llvm.ptr -> i64
      %425 = llvm.load %364 : !llvm.ptr -> i64
      %426 = arith.constant 2 : i32
      %428 = arith.extsi %426 : i32 to i64
      %427 = arith.addi %425, %428 : i64
      %429 = llvm.getelementptr %331[%427] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %424 = llvm.load %429 : !llvm.ptr -> i64
      %430 = arith.addi %421, %424 : i64
      %431 = arith.constant 0 : i32
      %432 = arith.constant 1 : i32
      %433 = arith.subi %431, %432 : i32
      %434 = arith.extsi %433 : i32 to i64
      %435 = llvm.mlir.constant(1 : i64) : i64
      %436 = llvm.alloca %435 x i64 : (i64) -> !llvm.ptr
      llvm.store %434, %436 : i64, !llvm.ptr
      %437 = llvm.load %364 : !llvm.ptr -> i64
      %438 = arith.constant 1 : i32
      %440 = arith.extsi %438 : i32 to i64
      %439 = arith.addi %437, %440 : i64
      %441 = arith.constant 1 : i32
      %443 = arith.extsi %441 : i32 to i64
      %442 = arith.andi %439, %443 : i64
      %444 = arith.constant 0 : i32
      %446 = arith.extsi %444 : i32 to i64
      %445 = arith.cmpi eq, %442, %446 : i64
      cf.cond_br %445, ^bb63, ^bb64
      ^bb63:
        %447 = arith.constant 1 : i32
        %448 = arith.extsi %447 : i32 to i64
        llvm.store %448, %436 : i64, !llvm.ptr
        cf.br ^bb65
      ^bb64:
        cf.br ^bb65
      ^bb65:
      %449 = llvm.load %436 : !llvm.ptr -> i64
      %450 = arith.muli %449, %430 : i64
      %451 = arith.addi %420, %450 : i64
      %452 = llvm.mlir.addressof @PX : !llvm.ptr
      %453 = llvm.load %452 : !llvm.ptr -> !llvm.ptr
      %454 = llvm.load %364 : !llvm.ptr -> i64
      %455 = llvm.getelementptr %453[%454] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %451, %455 : i64, !llvm.ptr
      %457 = llvm.load %364 : !llvm.ptr -> i64
      %458 = llvm.getelementptr %331[%457] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %456 = llvm.load %458 : !llvm.ptr -> i64
      %459 = llvm.load %436 : !llvm.ptr -> i64
      %461 = llvm.load %364 : !llvm.ptr -> i64
      %462 = arith.constant 1 : i32
      %464 = arith.extsi %462 : i32 to i64
      %463 = arith.addi %461, %464 : i64
      %465 = llvm.getelementptr %331[%463] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %460 = llvm.load %465 : !llvm.ptr -> i64
      %466 = arith.muli %459, %460 : i64
      %467 = arith.subi %456, %466 : i64
      %468 = llvm.mlir.addressof @PY : !llvm.ptr
      %469 = llvm.load %468 : !llvm.ptr -> !llvm.ptr
      %470 = llvm.load %364 : !llvm.ptr -> i64
      %471 = llvm.getelementptr %469[%470] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      llvm.store %467, %471 : i64, !llvm.ptr
      %472 = llvm.load %364 : !llvm.ptr -> i64
      %473 = arith.constant 1 : i32
      %475 = arith.extsi %473 : i32 to i64
      %474 = arith.addi %472, %475 : i64
      llvm.store %474, %364 : i64, !llvm.ptr
      cf.br ^bb60
    ^bb62:
    %476 = arith.constant 20000 : i32
    %477 = arith.extsi %476 : i32 to i64
    %479 = arith.constant 8 : i32
    %480 = arith.extsi %479 : i32 to i64
    %478 = func.call @calloc(%477, %480) : (i64, i64) -> !llvm.ptr
    %481 = llvm.mlir.addressof @LX : !llvm.ptr
    llvm.store %478, %481 : !llvm.ptr, !llvm.ptr
    %483 = arith.constant 8 : i32
    %484 = arith.extsi %483 : i32 to i64
    %482 = func.call @calloc(%477, %484) : (i64, i64) -> !llvm.ptr
    %485 = llvm.mlir.addressof @LY : !llvm.ptr
    llvm.store %482, %485 : !llvm.ptr, !llvm.ptr
    %487 = arith.constant 8 : i32
    %488 = arith.extsi %487 : i32 to i64
    %486 = func.call @calloc(%477, %488) : (i64, i64) -> !llvm.ptr
    %489 = llvm.mlir.addressof @LLAST : !llvm.ptr
    llvm.store %486, %489 : !llvm.ptr, !llvm.ptr
    %491 = arith.constant 8 : i32
    %492 = arith.extsi %491 : i32 to i64
    %490 = func.call @calloc(%477, %492) : (i64, i64) -> !llvm.ptr
    %493 = llvm.mlir.addressof @RX : !llvm.ptr
    llvm.store %490, %493 : !llvm.ptr, !llvm.ptr
    %495 = arith.constant 8 : i32
    %496 = arith.extsi %495 : i32 to i64
    %494 = func.call @calloc(%477, %496) : (i64, i64) -> !llvm.ptr
    %497 = llvm.mlir.addressof @RY : !llvm.ptr
    llvm.store %494, %497 : !llvm.ptr, !llvm.ptr
    %499 = arith.constant 8 : i32
    %500 = arith.extsi %499 : i32 to i64
    %498 = func.call @calloc(%477, %500) : (i64, i64) -> !llvm.ptr
    %501 = llvm.mlir.addressof @RFIRST : !llvm.ptr
    llvm.store %498, %501 : !llvm.ptr, !llvm.ptr
    %502 = llvm.mlir.addressof @LX : !llvm.ptr
    %503 = llvm.load %502 : !llvm.ptr -> !llvm.ptr
    %504 = llvm.mlir.zero : !llvm.ptr
    %505 = llvm.icmp "eq" %503, %504 : !llvm.ptr
    %506 = scf.if %505 -> (i1) {
      %507 = arith.constant true
      scf.yield %507 : i1
    } else {
      %508 = llvm.mlir.addressof @LY : !llvm.ptr
      %509 = llvm.load %508 : !llvm.ptr -> !llvm.ptr
      %510 = llvm.mlir.zero : !llvm.ptr
      %511 = llvm.icmp "eq" %509, %510 : !llvm.ptr
      scf.yield %511 : i1
    }
    %512 = scf.if %506 -> (i1) {
      %513 = arith.constant true
      scf.yield %513 : i1
    } else {
      %514 = llvm.mlir.addressof @LLAST : !llvm.ptr
      %515 = llvm.load %514 : !llvm.ptr -> !llvm.ptr
      %516 = llvm.mlir.zero : !llvm.ptr
      %517 = llvm.icmp "eq" %515, %516 : !llvm.ptr
      scf.yield %517 : i1
    }
    %518 = scf.if %512 -> (i1) {
      %519 = arith.constant true
      scf.yield %519 : i1
    } else {
      %520 = llvm.mlir.addressof @RX : !llvm.ptr
      %521 = llvm.load %520 : !llvm.ptr -> !llvm.ptr
      %522 = llvm.mlir.zero : !llvm.ptr
      %523 = llvm.icmp "eq" %521, %522 : !llvm.ptr
      scf.yield %523 : i1
    }
    %524 = scf.if %518 -> (i1) {
      %525 = arith.constant true
      scf.yield %525 : i1
    } else {
      %526 = llvm.mlir.addressof @RY : !llvm.ptr
      %527 = llvm.load %526 : !llvm.ptr -> !llvm.ptr
      %528 = llvm.mlir.zero : !llvm.ptr
      %529 = llvm.icmp "eq" %527, %528 : !llvm.ptr
      scf.yield %529 : i1
    }
    %530 = scf.if %524 -> (i1) {
      %531 = arith.constant true
      scf.yield %531 : i1
    } else {
      %532 = llvm.mlir.addressof @RFIRST : !llvm.ptr
      %533 = llvm.load %532 : !llvm.ptr -> !llvm.ptr
      %534 = llvm.mlir.zero : !llvm.ptr
      %535 = llvm.icmp "eq" %533, %534 : !llvm.ptr
      scf.yield %535 : i1
    }
    cf.cond_br %530, ^bb66, ^bb67
    ^bb66:
      %536 = arith.constant 1 : i32
      func.return %536 : i32
    ^bb67:
      cf.br ^bb68
    ^bb68:
    %537 = arith.constant 0 : i32
    %538 = llvm.mlir.addressof @LX : !llvm.ptr
    %539 = llvm.load %538 : !llvm.ptr -> !llvm.ptr
    %540 = arith.constant 0 : i32
    %541 = arith.extsi %537 : i32 to i64
    %542 = arith.extsi %540 : i32 to i64
    %543 = llvm.getelementptr %539[%542] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %541, %543 : i64, !llvm.ptr
    %544 = arith.constant 0 : i32
    %545 = llvm.mlir.addressof @LY : !llvm.ptr
    %546 = llvm.load %545 : !llvm.ptr -> !llvm.ptr
    %547 = arith.constant 0 : i32
    %548 = arith.extsi %544 : i32 to i64
    %549 = arith.extsi %547 : i32 to i64
    %550 = llvm.getelementptr %546[%549] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %548, %550 : i64, !llvm.ptr
    %551 = arith.constant 0 : i32
    %552 = arith.constant 1000000000 : i32
    %553 = arith.subi %551, %552 : i32
    %554 = llvm.mlir.addressof @LLAST : !llvm.ptr
    %555 = llvm.load %554 : !llvm.ptr -> !llvm.ptr
    %556 = arith.constant 0 : i32
    %557 = arith.extsi %553 : i32 to i64
    %558 = arith.extsi %556 : i32 to i64
    %559 = llvm.getelementptr %555[%558] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %557, %559 : i64, !llvm.ptr
    %560 = arith.constant 1 : i32
    %561 = arith.extsi %560 : i32 to i64
    %562 = llvm.mlir.addressof @LN : !llvm.ptr
    llvm.store %561, %562 : i64, !llvm.ptr
    %563 = arith.constant 1 : i32
    %564 = arith.extsi %563 : i32 to i64
    llvm.store %564, %364 : i64, !llvm.ptr
    cf.br ^bb69
    ^bb69:
    %565 = llvm.load %364 : !llvm.ptr -> i64
    %566 = arith.constant 24 : i32
    %568 = arith.extsi %566 : i32 to i64
    %567 = arith.cmpi sle, %565, %568 : i64
    cf.cond_br %567, ^bb70, ^bb71
    ^bb70:
      %571 = llvm.mlir.addressof @PX : !llvm.ptr
      %572 = llvm.load %571 : !llvm.ptr -> !llvm.ptr
      %573 = llvm.load %364 : !llvm.ptr -> i64
      %574 = llvm.getelementptr %572[%573] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %570 = llvm.load %574 : !llvm.ptr -> i64
      %576 = llvm.mlir.addressof @PY : !llvm.ptr
      %577 = llvm.load %576 : !llvm.ptr -> !llvm.ptr
      %578 = llvm.load %364 : !llvm.ptr -> i64
      %579 = llvm.getelementptr %577[%578] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %575 = llvm.load %579 : !llvm.ptr -> i64
      %580 = llvm.load %364 : !llvm.ptr -> i64
      %581 = arith.constant 3 : i32
      %583 = arith.extsi %581 : i32 to i64
      %582 = arith.addi %580, %583 : i64
      %584 = llvm.load %364 : !llvm.ptr -> i64
      %585 = arith.constant 24 : i32
      %586 = arith.extsi %585 : i32 to i64
      func.call @gen_left(%570, %575, %582, %584, %586) : (i64, i64, i64, i64, i64) -> ()
      %587 = llvm.load %364 : !llvm.ptr -> i64
      %588 = arith.constant 1 : i32
      %590 = arith.extsi %588 : i32 to i64
      %589 = arith.addi %587, %590 : i64
      llvm.store %589, %364 : i64, !llvm.ptr
      cf.br ^bb69
    ^bb71:
    %591 = arith.constant 0 : i32
    %592 = llvm.mlir.addressof @RX : !llvm.ptr
    %593 = llvm.load %592 : !llvm.ptr -> !llvm.ptr
    %594 = arith.constant 0 : i32
    %595 = arith.extsi %591 : i32 to i64
    %596 = arith.extsi %594 : i32 to i64
    %597 = llvm.getelementptr %593[%596] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %595, %597 : i64, !llvm.ptr
    %598 = arith.constant 0 : i32
    %599 = llvm.mlir.addressof @RY : !llvm.ptr
    %600 = llvm.load %599 : !llvm.ptr -> !llvm.ptr
    %601 = arith.constant 0 : i32
    %602 = arith.extsi %598 : i32 to i64
    %603 = arith.extsi %601 : i32 to i64
    %604 = llvm.getelementptr %600[%603] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %602, %604 : i64, !llvm.ptr
    %605 = arith.constant 1000000000 : i32
    %606 = llvm.mlir.addressof @RFIRST : !llvm.ptr
    %607 = llvm.load %606 : !llvm.ptr -> !llvm.ptr
    %608 = arith.constant 0 : i32
    %609 = arith.extsi %605 : i32 to i64
    %610 = arith.extsi %608 : i32 to i64
    %611 = llvm.getelementptr %607[%610] : (!llvm.ptr, i64) -> !llvm.ptr, i64
    llvm.store %609, %611 : i64, !llvm.ptr
    %612 = arith.constant 1 : i32
    %613 = arith.extsi %612 : i32 to i64
    %614 = llvm.mlir.addressof @RN : !llvm.ptr
    llvm.store %613, %614 : i64, !llvm.ptr
    %615 = arith.constant 25 : i32
    %616 = arith.extsi %615 : i32 to i64
    llvm.store %616, %364 : i64, !llvm.ptr
    cf.br ^bb72
    ^bb72:
    %617 = llvm.load %364 : !llvm.ptr -> i64
    %618 = arith.constant 48 : i32
    %620 = arith.extsi %618 : i32 to i64
    %619 = arith.cmpi sle, %617, %620 : i64
    cf.cond_br %619, ^bb73, ^bb74
    ^bb73:
      %623 = llvm.mlir.addressof @PX : !llvm.ptr
      %624 = llvm.load %623 : !llvm.ptr -> !llvm.ptr
      %625 = llvm.load %364 : !llvm.ptr -> i64
      %626 = llvm.getelementptr %624[%625] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %622 = llvm.load %626 : !llvm.ptr -> i64
      %628 = llvm.mlir.addressof @PY : !llvm.ptr
      %629 = llvm.load %628 : !llvm.ptr -> !llvm.ptr
      %630 = llvm.load %364 : !llvm.ptr -> i64
      %631 = llvm.getelementptr %629[%630] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %627 = llvm.load %631 : !llvm.ptr -> i64
      %632 = llvm.load %364 : !llvm.ptr -> i64
      %633 = arith.constant 3 : i32
      %635 = arith.extsi %633 : i32 to i64
      %634 = arith.addi %632, %635 : i64
      %636 = llvm.load %364 : !llvm.ptr -> i64
      %637 = arith.constant 48 : i32
      %638 = arith.extsi %637 : i32 to i64
      func.call @gen_right(%622, %627, %634, %636, %638) : (i64, i64, i64, i64, i64) -> ()
      %639 = llvm.load %364 : !llvm.ptr -> i64
      %640 = arith.constant 1 : i32
      %642 = arith.extsi %640 : i32 to i64
      %641 = arith.addi %639, %642 : i64
      llvm.store %641, %364 : i64, !llvm.ptr
      cf.br ^bb72
    ^bb74:
    func.call @sort_right_by_y() : () -> ()
    %644 = arith.constant 0 : i32
    %645 = arith.extsi %644 : i32 to i64
    %646 = llvm.mlir.constant(1 : i64) : i64
    %647 = llvm.alloca %646 x i64 : (i64) -> !llvm.ptr
    llvm.store %645, %647 : i64, !llvm.ptr
    %648 = arith.constant 0 : i32
    %649 = arith.extsi %648 : i32 to i64
    %650 = llvm.mlir.constant(1 : i64) : i64
    %651 = llvm.alloca %650 x i64 : (i64) -> !llvm.ptr
    llvm.store %649, %651 : i64, !llvm.ptr
    cf.br ^bb75
    ^bb75:
    %652 = llvm.load %651 : !llvm.ptr -> i64
    %653 = llvm.mlir.addressof @LN : !llvm.ptr
    %654 = llvm.load %653 : !llvm.ptr -> i64
    %655 = arith.cmpi slt, %652, %654 : i64
    cf.cond_br %655, ^bb76, ^bb77
    ^bb76:
      %656 = arith.constant 0 : i32
      %658 = llvm.mlir.addressof @LY : !llvm.ptr
      %659 = llvm.load %658 : !llvm.ptr -> !llvm.ptr
      %660 = llvm.load %651 : !llvm.ptr -> i64
      %661 = llvm.getelementptr %659[%660] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %657 = llvm.load %661 : !llvm.ptr -> i64
      %663 = arith.extsi %656 : i32 to i64
      %662 = arith.subi %663, %657 : i64
      %665 = llvm.mlir.addressof @LLAST : !llvm.ptr
      %666 = llvm.load %665 : !llvm.ptr -> !llvm.ptr
      %667 = llvm.load %651 : !llvm.ptr -> i64
      %668 = llvm.getelementptr %666[%667] : (!llvm.ptr, i64) -> !llvm.ptr, i64
      %664 = llvm.load %668 : !llvm.ptr -> i64
      %669 = arith.constant 0 : i32
      %670 = arith.extsi %669 : i32 to i64
      %671 = llvm.mlir.constant(1 : i64) : i64
      %672 = llvm.alloca %671 x i64 : (i64) -> !llvm.ptr
      llvm.store %670, %672 : i64, !llvm.ptr
      %673 = llvm.mlir.addressof @RN : !llvm.ptr
      %674 = llvm.load %673 : !llvm.ptr -> i64
      %675 = llvm.mlir.constant(1 : i64) : i64
      %676 = llvm.alloca %675 x i64 : (i64) -> !llvm.ptr
      llvm.store %674, %676 : i64, !llvm.ptr
      cf.br ^bb78
      ^bb78:
      %677 = llvm.load %672 : !llvm.ptr -> i64
      %678 = llvm.load %676 : !llvm.ptr -> i64
      %679 = arith.cmpi slt, %677, %678 : i64
      cf.cond_br %679, ^bb79, ^bb80
      ^bb79:
        %680 = llvm.load %672 : !llvm.ptr -> i64
        %681 = llvm.load %676 : !llvm.ptr -> i64
        %682 = arith.addi %680, %681 : i64
        %683 = arith.constant 2 : i32
        %685 = arith.extsi %683 : i32 to i64
        %684 = arith.divsi %682, %685 : i64
        %687 = llvm.mlir.addressof @RY : !llvm.ptr
        %688 = llvm.load %687 : !llvm.ptr -> !llvm.ptr
        %689 = llvm.getelementptr %688[%684] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        %686 = llvm.load %689 : !llvm.ptr -> i64
        %690 = arith.cmpi slt, %686, %662 : i64
        cf.cond_br %690, ^bb81, ^bb82
        ^bb81:
          %691 = arith.constant 1 : i32
          %693 = arith.extsi %691 : i32 to i64
          %692 = arith.addi %684, %693 : i64
          llvm.store %692, %672 : i64, !llvm.ptr
          cf.br ^bb83
        ^bb82:
          llvm.store %684, %676 : i64, !llvm.ptr
          cf.br ^bb83
        ^bb83:
        cf.br ^bb78
      ^bb80:
      %694 = llvm.load %672 : !llvm.ptr -> i64
      %695 = llvm.mlir.constant(1 : i64) : i64
      %696 = llvm.alloca %695 x i64 : (i64) -> !llvm.ptr
      llvm.store %694, %696 : i64, !llvm.ptr
      cf.br ^bb84
      ^bb84:
      %697 = llvm.load %696 : !llvm.ptr -> i64
      %698 = llvm.mlir.addressof @RN : !llvm.ptr
      %699 = llvm.load %698 : !llvm.ptr -> i64
      %700 = arith.cmpi slt, %697, %699 : i64
      cf.cond_br %700, ^bb85, ^bb86
      ^bb85:
        %702 = llvm.mlir.addressof @RY : !llvm.ptr
        %703 = llvm.load %702 : !llvm.ptr -> !llvm.ptr
        %704 = llvm.load %696 : !llvm.ptr -> i64
        %705 = llvm.getelementptr %703[%704] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        %701 = llvm.load %705 : !llvm.ptr -> i64
        %706 = arith.cmpi ne, %701, %662 : i64
        cf.cond_br %706, ^bb87, ^bb88
        ^bb87:
          cf.br ^bb86
        ^bb88:
          cf.br ^bb89
        ^bb89:
        %708 = llvm.mlir.addressof @RFIRST : !llvm.ptr
        %709 = llvm.load %708 : !llvm.ptr -> !llvm.ptr
        %710 = llvm.load %696 : !llvm.ptr -> i64
        %711 = llvm.getelementptr %709[%710] : (!llvm.ptr, i64) -> !llvm.ptr, i64
        %707 = llvm.load %711 : !llvm.ptr -> i64
        %712 = arith.constant 3 : i32
        %714 = arith.extsi %712 : i32 to i64
        %713 = arith.addi %664, %714 : i64
        %715 = arith.cmpi sge, %707, %713 : i64
        cf.cond_br %715, ^bb90, ^bb91
        ^bb90:
          %717 = llvm.mlir.addressof @LX : !llvm.ptr
          %718 = llvm.load %717 : !llvm.ptr -> !llvm.ptr
          %719 = llvm.load %651 : !llvm.ptr -> i64
          %720 = llvm.getelementptr %718[%719] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %716 = llvm.load %720 : !llvm.ptr -> i64
          %722 = llvm.mlir.addressof @RX : !llvm.ptr
          %723 = llvm.load %722 : !llvm.ptr -> !llvm.ptr
          %724 = llvm.load %696 : !llvm.ptr -> i64
          %725 = llvm.getelementptr %723[%724] : (!llvm.ptr, i64) -> !llvm.ptr, i64
          %721 = llvm.load %725 : !llvm.ptr -> i64
          %726 = arith.addi %716, %721 : i64
          %727 = arith.constant 2 : i32
          %729 = arith.extsi %727 : i32 to i64
          %728 = arith.divsi %726, %729 : i64
          %730 = arith.constant 0 : i32
          %732 = arith.extsi %730 : i32 to i64
          %731 = arith.cmpi sgt, %728, %732 : i64
          cf.cond_br %731, ^bb93, ^bb94
          ^bb93:
            %733 = arith.cmpi sle, %728, %318 : i64
            cf.cond_br %733, ^bb96, ^bb97
            ^bb96:
              %734 = llvm.load %647 : !llvm.ptr -> i64
              %735 = arith.addi %734, %728 : i64
              llvm.store %735, %647 : i64, !llvm.ptr
              cf.br ^bb98
            ^bb97:
              cf.br ^bb98
            ^bb98:
            cf.br ^bb95
          ^bb94:
            cf.br ^bb95
          ^bb95:
          cf.br ^bb92
        ^bb91:
          cf.br ^bb92
        ^bb92:
        %736 = llvm.load %696 : !llvm.ptr -> i64
        %737 = arith.constant 1 : i32
        %739 = arith.extsi %737 : i32 to i64
        %738 = arith.addi %736, %739 : i64
        llvm.store %738, %696 : i64, !llvm.ptr
        cf.br ^bb84
      ^bb86:
      %740 = llvm.load %651 : !llvm.ptr -> i64
      %741 = arith.constant 1 : i32
      %743 = arith.extsi %741 : i32 to i64
      %742 = arith.addi %740, %743 : i64
      llvm.store %742, %651 : i64, !llvm.ptr
      cf.br ^bb75
    ^bb77:
    %744 = llvm.mlir.addressof @str_0 : !llvm.ptr
    %745 = llvm.load %647 : !llvm.ptr -> i64
    %746 = arith.constant 1 : i32
    %748 = arith.extsi %746 : i32 to i64
    %747 = arith.addi %745, %748 : i64
    %749 = llvm.call @printf(%744, %747) vararg(!llvm.func<i32 (ptr, ...)>) : (!llvm.ptr, i64) -> i32
    %751 = llvm.mlir.addressof @PX : !llvm.ptr
    %752 = llvm.load %751 : !llvm.ptr -> !llvm.ptr
    func.call @free(%752) : (!llvm.ptr) -> ()
    %754 = llvm.mlir.addressof @PY : !llvm.ptr
    %755 = llvm.load %754 : !llvm.ptr -> !llvm.ptr
    func.call @free(%755) : (!llvm.ptr) -> ()
    func.call @free(%331) : (!llvm.ptr) -> ()
    %758 = llvm.mlir.addressof @LX : !llvm.ptr
    %759 = llvm.load %758 : !llvm.ptr -> !llvm.ptr
    func.call @free(%759) : (!llvm.ptr) -> ()
    %761 = llvm.mlir.addressof @LY : !llvm.ptr
    %762 = llvm.load %761 : !llvm.ptr -> !llvm.ptr
    func.call @free(%762) : (!llvm.ptr) -> ()
    %764 = llvm.mlir.addressof @LLAST : !llvm.ptr
    %765 = llvm.load %764 : !llvm.ptr -> !llvm.ptr
    func.call @free(%765) : (!llvm.ptr) -> ()
    %767 = llvm.mlir.addressof @RX : !llvm.ptr
    %768 = llvm.load %767 : !llvm.ptr -> !llvm.ptr
    func.call @free(%768) : (!llvm.ptr) -> ()
    %770 = llvm.mlir.addressof @RY : !llvm.ptr
    %771 = llvm.load %770 : !llvm.ptr -> !llvm.ptr
    func.call @free(%771) : (!llvm.ptr) -> ()
    %773 = llvm.mlir.addressof @RFIRST : !llvm.ptr
    %774 = llvm.load %773 : !llvm.ptr -> !llvm.ptr
    func.call @free(%774) : (!llvm.ptr) -> ()
    %775 = arith.constant 0 : i32
    func.return %775 : i32
  }
}