#include <bits/stdc++.h> using namespace std; inline int read(){ int s = 0,w = 1;char c= getchar(); while(!isdigit(c)) w = c =='-' ? -w :w,c = getchar(); while(isdigit(c)) s = (s<<3) + (s<<1) + c - '0',c = getchar(); return s * w; } inline void out(int x){ if(x<0) putchar('-'),x = -x; char s[40];int top = 0; do{s[top++]=x%10+'0',x/=10;}while(x); while(top) putchar(s[--top]); puts(""); } const int N = 1e5 + 10; int n,q,a[N]; int main(){ n = read(),q = read(); for(int i = 0;i<n;a[i++]=read()); while(q--){ int op,L,R,x; op = read(),L= read(),R = read(),x = read(); R--; if(op==1){ //找到第一个大于等于x的 int l = L-1,r = R+1; while(l+1<r){ int m = l + r >> 1; if(a[m]>=x) r = m; else l = m; } out(r<=R?a[r]:-1); } else if(op==2){ //找到第一个大于x的 int l = L-1,r = R+1; while(l+1<r){ int m = l + r >> 1; if(a[m]>x) r = m; else l = m; } out(r<=R?a[r]:-1); } else if(op==3){ //找到最后一个小于x的 int l = L-1,r = R+1; while(l+1<r){ int m = l + r >> 1; if(a[m]<x) l = m; else r = m; } out(l>=L?a[l]:-1); } else{ //找到最后一个小于等于x的 int l = L-1,r = R+1; while(l+1<r){ int m = l + r >> 1; if(a[m]<=x) l = m; else r = m; } out(l>=L?a[l]:-1); } } return 0; }