#include <iostream>
#include<vector>
#include<algorithm>
using namespace std;
//方法一:直接使用内置的函数
//方法二:自己实现二分查找
vector<int>::iterator bisearch(vector<int>::iterator left,vector<int>::iterator right,int target)//返回数组范围中第一个大于等于target的位置的迭代器
{
//找中间值,随机访问迭代器支持直接算术运算
while(left<right)
{
auto mid=left+(right-1-left)/2;
if(*mid<target)
left=mid+1;
else
right=mid;
}
//处理区间[left,right);其中在left左边的元素都小于target,
//right自身和其右边的元素都大于等于target
return right;
}
vector<int>::iterator bisearch1(vector<int>::iterator left,vector<int>::iterator right,int target)//返回数组范围中第一个大于target的位置的迭代器
{
//找中间值,随机访问迭代器支持直接算术运算
while(left<right)
{
auto mid=left+(right-1-left)/2;
if(*mid<=target)
left=mid+1;
else
right=mid;
}
//处理区间[left,right);其中在left左边的元素都小于等于target,
//right自身和其右边的元素都大于target
return right;
}
int main() {
int n, q;
cin >> n >> q;
vector<int>nums;
while (n--)
{
int num;
cin >> num;
nums.push_back(num);
}
//依次处理询问
int op, l, r, x;
while (cin >> op >> l >> r >> x)
{
auto begin = nums.begin() + l;
auto end = nums.begin() + r;
if (op == 1)//情况一
{
auto it = bisearch(begin, end, x);
if (it != end)
cout<< *it<<endl;
else
cout<< -1<<endl;
}
//情况二
else if (op == 2)
{
auto it = bisearch1(begin, end, x);
if (it != end)
cout << *it<<endl;
else
cout << -1<<endl;
}
//情况三
else if (op == 3)
{
auto it = bisearch(begin, end, x);
if (it != begin)
cout << *(--it)<<endl;
else
cout << -1<<endl;
}
//情况四
else if (op == 4)
{
auto it = bisearch1(begin, end, x);
if (it != begin)
cout << *(--it)<<endl;
else
cout << -1<<endl;
}
}
return 0;
}