#include <iostream>
using namespace std;
const int Max = 5000003;
long long n , m , tot , len1 , len2;
long long t[Max<<2] , add[Max<<2] , ans[Max] , cost[Max];
struct zx{
long long bo , l , r , k , id;
}p[Max] , p1[Max] , p2[Max];
void lazy(long long x , long long l , long long r) {
long long mid = l + r >> 1;
t[x*2] += add[x] * (mid - l + 1);
t[x*2+1] += add[x] * (r - mid);
add[x*2] += add[x];
add[x*2+1] += add[x];
add[x] = 0;
}
void change(long long x , long long front , long long tail , long long l , long long r , long long v) {
if(front >= l && tail <= r) {
t[x] += v * (tail - front + 1);
add[x] += v;
return ;
}
lazy(x , front , tail);
long long mid = front + tail >> 1;
if(l <= mid) change (x*2 , front , mid , l , r , v);
if(r > mid) change (x*2+1 , mid+1 , r , l , r , v);
t[x] = t[x*2] + t[x*2+1];
}
long long ask(long long x , long long front , long long tail , long long l , long long r) {
if(front >= l && tail <= r) return t[x];
long long mid = front + tail >> 1 , ans = 0;
lazy(x , front , tail);
if(l <= mid) ans += ask (x*2 , front , mid , l , r);
if(r > mid) ans += ask(x*2+1 , mid+1 , tail , l , r);
return ans;
}
void work(long long front , long long tail , long long l , long long r) {
if(front > tail || l > r) return ;
if(l == r) {
for(long long i = front; i <= tail; i++) {
if(p[i].bo == 2) ans[p[i].id] = l;
}
return ;
}
long long mid = l + r >> 1;
for(long long i = front; i <= tail; i++) {
if(p[i].bo == 1 && p[i].k > mid) change(1 , 1 , n , p[i].l , p[i].r , 1);
else if(p[i].bo == 2) cost [i] = ask(1 , 1 , n , p[i].l , p[i].r);
}
for(long long i = front; i <= tail; i++) {
if(p[i].bo == 1 && p[i].k > mid) change(1 , 1 , n , p[i].l , p[i].r , -1);
}
long long len1 = 0 , len2 = 0;
for(long long i = front; i <= tail; i++) {
if(p[i].bo == 2) {
if(p[i].k <= cost[i]) p2[len2++] = p[i];
else {
p[i].k -= cost[i];
p1[len1++] = p[i];
}
}
else {
if(p[i].k <= mid) p1[len1++] = p[i];
else p2[len2++] = p[i];
}
}
for(long long i = 0; i < len1; i++) p[front+i] = p1[i];
for(long long i = 0; i < len2; i++) p[front+i+len1] = p2[i];
work(front , front+len1-1 , l , mid);
work(front+len1 , tail , mid+1 , r);
}
int main() {
cin >> n >> m;
for(long long i = 1; i <= m; i++) {
cin >> p[i].bo >> p[i].l >> p[i].r >> p[i].k;
if(p[i].bo == 2) p[i].id = tot ++;
}
work(1 , m , 0 , n);
for(long long i = 0; i < tot; i++) cout << ans[i] <<endl;
return 0;
}