RT,实在找不出来错了
#include <bits/stdc++.h>
#define rep(i, f, t) for(int i(f); i <= t; ++i)
#define re(i, t) for(int i(1); i <= t; ++i)
#define per(i, t, f) for(int i(t); i >= f; --i)
#define pe(i, t) for(int i(t); i >= 1; --i)
#define ste(i, f, t, s) for(int i(f); i <= t; i += s)
#define ets(i, t, f, s) for(int i(t); i >= f; i -= s)
#define each(i, x) for(auto &i : (x))
#define nx(i, u) for(int i(head[u]); i; i = e[i].nxt)
typedef long long ll;
typedef long double lb;
typedef unsigned long long ull;
#define int long long
using namespace std;
typedef pair <double, int> pdi;
typedef pair <int, int> pii;
// typedef pair <string, bool> psb;
#define pb push_back
#define fi first
#define se second
#define ix(l, r) ((l + r) | (l != r))
#define ls ix(l, mid)
#define rs ix(mid + 1, r)
#define mp(i, j) (make_pair(i, j))
#define inf 0x3f3f3f3f
#define INF 0x3f3f3f3f3f3f3f3f
#define dinf 1000000000000.0
#define eps 1e-10
const int N = 5e4 + 5;
int n, m;
ll ans[N];
struct node {
int op, l, r, k, id;
}q[N], q1[N], q2[N];
struct Tree {
ll sum;
ll laz;
}tr[N<<1];
void pushup (int l, int r) {
int mid = (l + r) >> 1;
tr[ix(l, r)].sum = tr[ls].sum + tr[rs].sum;
}
void pushdown (int l, int r) {
int mid = (l + r) >> 1;
if(ll laz = tr[ix(l, r)].laz) {
tr[ls].laz += laz;
tr[rs].laz += laz;
tr[ls].sum += 1ll * (mid - l + 1) * laz;
tr[rs].sum += 1ll * (r - mid) * laz;
tr[ix(l, r)].laz = 0;
}
}
void update (int l, int r, int dl, int dr, int w) {
if(dl <= l && r <= dr) {
tr[ix(l, r)].sum += (r - l + 1) * w;
tr[ix(l, r)].laz += w;
return ;
}
pushdown(l ,r);
int mid = (l + r) >> 1;
if(dl <= mid) update(l, mid, dl, dr, w);
if(dr > mid) update(mid + 1, r, dl, dr, w);
pushup(l, r);
}
ll query (int l, int r, int dl, int dr) {
if(dl <= l && r <= dr) {
return tr[ix(l ,r)].sum;
}
ll res = 0;
pushdown(l, r);
int mid = (l + r) >> 1;
if(dl <= mid) res += query(l, mid, dl, dr);
if(dr > mid) res += query(mid + 1, r, dl, dr);
return res;
}
void solve (int l, int r, int ql, int qr) {
if(l == r) {
rep(i, ql, qr) if(q[i].op == 2) ans[q[i].id] = l;
return ;
}
int mid = (l + r) >> 1;
int tot1 = 0, tot2 = 0;
rep(i, ql, qr) {
if(q[i].op == 1) {
if(q[i].k > mid) {
update(1, n, q[i].l, q[i].r, 1);
q2[++tot2] = q[i];
}
else q1[++tot1] = q[i];
}
else {
ll t = query(1, n, q[i].l, q[i].r);
if(q[i].k > t) q[i].k -= t, q1[++tot1] = q[i];
else q2[++tot2] = q[i];
}
}
re(i, tot1) q[i + ql - 1] = q1[i];
re(i, tot2) q[i + ql + tot1 - 1] = q2[i];
re(i, tot2) {
update(1, n, q2[i].l, q2[i].r, -1);
}
solve(l, mid, ql, ql + tot1 - 1);
solve(mid + 1, r, ql + tot1, qr);
}
signed main () {
freopen("1.in", "r", stdin);
ios::sync_with_stdio(false);
cin >> n >> m;
re(i, m) {
cin >> q[i].op >> q[i].l >> q[i].r >> q[i].k;
q[i].id = i;
}
solve(-n, n, 1, m);
re(i, m) {
if(ans[i]) cout << ans[i] << "\n";
}
return 0;
}