#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;
}