#include <bits/stdc++.h>
#define lowbit(x) (x & (-x))
using namespace std;
long long n, m;
struct BIT
{
    vector<long long> val,a1,a2;
    void init()
    {
    	val.resize(n + 10);
    	a1.resize(n + 10);
    	a2.resize(n + 10);
    }
    void update(long long pos,long long k) {
        for(long long i = pos;i <= n + 5;i += lowbit(i)) {
            a1[i] += k;
            a2[i] += k * pos;
        }
    }
    long long query(long long pos) {
        long long res = 0;
        for(long long i = pos;i > 0;i -= lowbit(i)) res += (pos + 1) * a1[i] - a2[i];
        return res;
    }
    void bulid(){for(long long i = 1;i <= n + 5;++i) update(i,val[i] - val[i - 1]);}
    void reg_add(long long l,long long r,long long k){update(l,k);update(r + 1,-k);}
    long long reg_sum(long long l,long long r){return query(r) - query(l - 1);}
} wlx;
struct operate
{
	long long opt, l, r, c;
};
operate a[50010];
long long ans[50010];
void work(long long ld, long long rd, vector <long long> now)
{
	if (now.empty()) return ;
	if (ld == rd) {for (auto x : now) ans[x] = ld; return ;}
	long long mid = ld + (rd - ld) / 2;
	vector <long long> left, right;
	for (auto x : now)
		if (a[x].opt == 1)
		{
			if (a[x].c > mid) {wlx.reg_add(a[x].l, a[x].r, 1); right.push_back(x);}
			else left.push_back(x);
		}
	for (auto x : now)
		if (a[x].opt == 2)
		{
			long long num = wlx.reg_sum(a[x].l, a[x].r);
			if (a[x].c > num) {a[x].c -= num; left.push_back(x);}
			else right.push_back(x);
		}
	for (auto x : now) if (a[x].opt == 1 && a[x].c > mid) wlx.reg_add(a[x].l, a[x].r, -1);
	work(mid + 1, rd, right);
	work(ld, mid, left);
}
int main()
{
	cin >> n >> m;
	wlx.init();
	for (long long i = 1; i <= m; i++) cin >> a[i].opt >> a[i].l >> a[i].r >> a[i].c;
	vector <long long> all;
	for (long long i = 1; i <= m; i++) all.push_back(i);
	work(-n, n, all);
	for (long long i = 1; i <= m; i++) if (a[i].opt == 2) cout << ans[i] << endl;
	return 0;
}