#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 50005; // Adjusted to match the problem's constraints
ll n, m;
ll tr[4 * N], ls[4 * N], rs[4 * N], lz[4 * N];
void update(ll p, ll l, ll r) {
ll mid = (l + r) >> 1;
ls[p] = ls[2 * p];
if (ls[p] == mid - l + 1)
ls[p] += ls[2 * p + 1];
rs[p] = rs[2 * p + 1];
if (rs[p] == r - mid)
rs[p] += rs[2 * p];
tr[p] = max(max(tr[2 * p], tr[2 * p + 1]), rs[2 * p] + ls[2 * p + 1]);
}
void build(ll p, ll l, ll r) {
lz[p] = -1; // Initialize lazy tag to -1 (no action)
if (l == r) {
tr[p] = ls[p] = rs[p] = 1;
return;
}
ll mid = (l + r) >> 1;
build(2 * p, l, mid);
build(2 * p + 1, mid + 1, r);
update(p, l, r);
}
void pushdown(ll p, ll l, ll r) {
if (lz[p] == -1)
return;
ll mid = (l + r) >> 1;
if (lz[p] == 0) { // Mark as free
tr[2 * p] = ls[2 * p] = rs[2 * p] = mid - l + 1;
tr[2 * p + 1] = ls[2 * p + 1] = rs[2 * p + 1] = r - mid;
} else if (lz[p] == 1) { // Mark as occupied
tr[2 * p] = ls[2 * p] = rs[2 * p] = 0;
tr[2 * p + 1] = ls[2 * p + 1] = rs[2 * p + 1] = 0;
}
lz[2 * p] = lz[2 * p + 1] = lz[p];
lz[p] = -1;
}
void change(ll p, ll l, ll r, ll x, ll y, ll z) {
if (x <= l && r <= y) {
if (z == 0) { // Free
tr[p] = ls[p] = rs[p] = r - l + 1;
} else { // Occupied
tr[p] = ls[p] = rs[p] = 0;
}
lz[p] = z;
return;
}
pushdown(p, l, r);
ll mid = (l + r) >> 1;
if (y <= mid)
change(2 * p, l, mid, x, y, z);
else if (x > mid)
change(2 * p + 1, mid + 1, r, x, y, z);
else {
change(2 * p, l, mid, x, mid, z);
change(2 * p + 1, mid + 1, r, mid + 1, y, z);
}
update(p, l, r);
}
ll searchh(ll p, ll l, ll r, ll x) {
if (tr[p] < x)
return 0; // No enough free rooms
if (r - l + 1 == x)
return l;
pushdown(p, l, r);
ll mid = (l + r) >> 1;
if (tr[2 * p] >= x)
return searchh(2 * p, l, mid, x);
else if (rs[2 * p] + ls[2 * p + 1] >= x)
return mid - rs[2 * p] + 1;
else
return searchh(2 * p + 1, mid + 1, r, x);
}
int main() {
scanf("%lld%lld", &n, &m);
build(1, 1, n);
while (m--) {
ll op, x, y;
scanf("%lld", &op);
if (op == 1) {
scanf("%lld", &x);
if (tr[1] < x) {
printf("0\n");
} else {
ll pos = searchh(1, 1, n, x);
printf("%lld\n", pos);
change(1, 1, n, pos, pos + x - 1, 1); // Mark as occupied
}
} else {
scanf("%lld%lld", &x, &y);
change(1, 1, n, x, x + y - 1, 0); // Mark as free
}
}
return 0;
}
#include <bits/stdc++.h>
#define ll long long
using namespace std;
const ll N = 1e5;
ll n, m;
ll tr[4 * N + 5], ls[4 * N + 5], rs[4 * N + 5], lz[4 * N + 5];
void update(ll p, ll l, ll r) {
ll mid = (l + r) >> 1;
ls[p] = ls[2 * p];
if (ls[p] == mid - l + 1)
ls[p] += ls[2 * p + 1];
rs[p] = rs[2 * p + 1];
if (rs[p] == r - mid)
rs[p] += rs[2 * p];
tr[p] = max(ls[p], rs[p]);
tr[p] = max(tr[p], rs[2 * p] + ls[2 * p + 1]);
return;
}
void build(ll p, ll l, ll r) {
if (l == r) {
ls[p] = rs[p] = tr[p] = 1;
return;
}
ll mid = (l + r) >> 1;
build(2 * p, l, mid), build(2 * p + 1, mid + 1, r);
update(p, l, r);
return;
}
void pushdown(ll p, ll l, ll r) {
if (lz[p] == 0)
return;
ll mid = (l + r) >> 1;
if (lz[p] - 1 == 0) {
tr[2 * p] = ls[2 * p] = rs[2 * p] = mid - l + 1;
tr[2 * p + 1] = ls[2 * p + 1] = rs[2 * p + 1] = r - mid;
} else if (lz[p] - 1 == 1) {
tr[2 * p] = ls[2 * p] = rs[2 * p] = 0;
tr[2 * p + 1] = ls[2 * p + 1] = rs[2 * p + 1] = 0;
}
lz[2 * p] = lz[2 * p + 1] = lz[p];
lz[p] = 0;
return;
}
void change(ll p, ll l, ll r, ll x, ll y, ll z) {
if (x <= l && r <= y) {
if (z == 0) {
ls[p] = rs[p] = tr[p] = r - l + 1;
} else {
ls[p] = rs[p] = tr[p] = 0;
}
lz[p] = z + 1;
return;
}
pushdown(p, l, r);
ll mid = (l + r) >> 1;
if (y <= mid)
change(2 * p, l, mid, x, y, z);
else if (x >= mid + 1)
change(2 * p + 1, mid + 1, r, x, y, z);
else {
change(2 * p, l, mid, x, mid, z);
change(2 * p + 1, mid + 1, r, mid + 1, y, z);
}
update(p, l, r);
return;
}
ll searchh(ll p, ll l, ll r, ll x) {
ll mid = (l + r) >> 1;
// cout<<p<<" "<<l<<" "<<r<<endl;
if (r - l + 1 == x)
return l;
pushdown(p, l, r);
if (tr[2 * p] >= x)
return searchh(2 * p, l, mid, x);
else if (rs[2 * p] + ls[2 * p + 1] >= x)
return mid - rs[2 * p] + 1;
else
return searchh(2 * p + 1, mid + 1, r, x);
}
// void work(ll p,ll l,ll r){
// cout<<l<<" "<<r<<" "<<tr[p]<<" "<<ls[p]<<" "<<rs[p]<<endl;
// if(l==r) return;
// ll mid=(l+r)>>1;
// pushdown(p,l,r);
// work(2*p,l,mid),work(2*p+1,mid+1,r);
// return;
//}
int main() {
scanf("%lld%lld", &n, &m);
build(1, 1, n);
// work(1,1,n);
while (m--) {
ll op, x, y;
scanf("%lld%lld", &op, &x);
if (op == 1) {
if (tr[1] < x)
printf("0\n");
else {
ll pos = searchh(1, 1, n, x);
printf("%lld\n", pos);
change(1, 1, n, pos, pos + x - 1, 1);
}
} else {
scanf("%lld", &y);
change(1, 1, n, x, x + y - 1, 0);
// cout<<x<<"oooooooo"<<x+y-1<<endl;
}
// cout<<endl;
// work(1,1,n);
// cout<<endl;
}
return 0;
}
/*
10 1
1 1
*/
这两份代码功能上有什么区别