#include <bits/stdc++.h>
using namespace std;
using LL = long long;
const int N = 5e4 + 5;
int n, m, cnt, totn;
int lx[N], rx[N], op[N], b[N], k[N];
int rt[N << 2], addx[N * 400]; //编号为p的权值线段树,区间线段树编号为rt[p]
LL sum[N * 400];
struct Tree{
    int L, R;
}T[N * 400];

void lazy(int p, int l, int r)
{
    int v = addx[p];
    int mid = l + r >> 1;

    if (!T[p].L) T[p].L = ++cnt;
    if (!T[p].R) T[p].R = ++cnt;
    addx[T[p].L] += v, addx[T[p].R] += v;
    sum[T[p].L] += v * (mid - l + 1), sum[T[p].R] += v * (r - mid);
    addx[p] = 0;
}

void change(int &p, int lx, int rx, int l = 1,int r = n) 
{
    if (!p) p = ++cnt;
    if (lx <= l && r <= rx) {
        ++addx[p];
        sum[p] += r - l + 1;
        return;
    }
    if (addx[p]) lazy(p, l, r);

    int mid = l + r >> 1;
    if (lx <= mid) change(T[p].L, lx, rx, l, mid);
    if (mid < rx) change(T[p].R, lx, rx, mid + 1, r);
    sum[p] = sum[T[p].L] + sum[T[p].R];
}

LL getsum(int &p, int lx, int rx, int l = 1, int r = n) 
{
    if (!p) return 0;
    if (lx <= l && r <= rx) return sum[p];
    if (addx[p]) lazy(p, l, r);
    int mid = l + r >> 1;
    LL tt = 0;
    if (lx <= mid) tt += getsum(T[p].L, lx, rx, l, mid);
    if (mid < rx) tt += getsum(T[p].R, lx, rx, mid + 1, r);
    return tt;
}

void add(int lx, int rx, int k, int p = 1, int l = 1, int r = totn) 
{
    change(rt[p], lx, rx);
    if (l == r) return;
    int mid = l + r >> 1;
    if (k <= mid) 
        add(lx, rx, k, p * 2, l, mid);
    else 
        add(lx, rx, k, p * 2 + 1, mid + 1, r);
}

int ask(int lx, int rx, LL k, int p = 1, int l = 1, int r = totn) 
{
    if (l == r) return b[l];
    int mid = l + r >> 1;
    LL tt = getsum(rt[p * 2 + 1], lx, rx);
    if (tt < k) 
        return ask(lx, rx, k - tt, p * 2, l, mid);
    else 
        return ask(lx, rx, k, p * 2 + 1, mid + 1, r);
}

int main()
{
    ios::sync_with_stdio(0);
    cin.tie(0);
    cin >> n >> m;
    for(int i = 1; i <= m; i++)
    {
        cin >> op[i] >> lx[i] >> rx[i] >> k[i];
        if (op[i] == 1) b[++totn] = k[i];
    }
    sort(b + 1, b + totn + 1);
    totn = unique(b + 1, b + totn + 1) - b - 1;

    for(int i = 1; i <= m; i++)
    if(op[i] == 1) k[i] = lower_bound(b + 1,b + totn + 1, k[i]) - b;

    for(int i = 1; i <= m; i++)
    {
        if(op[i] == 1) add(lx[i], rx[i], k[i]);
        else cout << ask(lx[i], rx[i], k[i]) << '\n';
    }
    return 0;
}