连样例都过不了QAQ 我太菜了
#include <iostream>
#include <cstdio>
using namespace std;
const int N = 5e4 + 10;
struct Node {
int l, r, sum, len, lmax, rmax, tag;
//区间最大连续空房数,区间长,
//最大前缀长,最大后缀长
}tr[N * 4];
int n, m;
//tag:1为开房,2为退房
void push_up(int u) {
//求tr[u].lmax
if (tr[u << 1].sum == tr[u << 1].len) {
tr[u].lmax = tr[u << 1].sum + tr[u << 1 | 1].lmax;
} else {
tr[u].lmax = tr[u << 1].lmax;
}
//求tr[u].rmax
if (tr[u << 1 | 1].sum == tr[u << 1 | 1].len) {
tr[u].rmax = tr[u << 1 | 1].sum + tr[u << 1].rmax;
} else {
tr[u].rmax = tr[u << 1 | 1].rmax;
}
//求tr[u].sum
tr[u].sum = max(max(tr[u << 1].sum, tr[u << 1 | 1].sum), tr[u << 1].rmax + tr[u << 1 | 1].lmax);
}
void push_down(int u) {
if (tr[u].tag == 0) {
return;
}
if (tr[u].tag == 1) {
tr[u << 1].tag = tr[u << 1 | 1].tag = 1;
tr[u << 1].sum = tr[u << 1].lmax = tr[u << 1].rmax = 0;
tr[u << 1 | 1].sum = tr[u << 1 | 1].lmax = tr[u << 1 | 1].rmax = 0;
}
if (tr[u].tag == 2) {
tr[u << 1].tag = tr[u << 1 | 1].tag = 2;
tr[u << 1].sum = tr[u << 1].lmax = tr[u << 1].rmax = tr[u << 1].len;
tr[u << 1 | 1].sum = tr[u << 1 | 1].lmax = tr[u << 1 | 1].rmax = tr[u << 1 | 1].len;
}
tr[u].tag = 0; //懒标记清零
}
void build(int u, int l, int r) {
if (l == r) {
int len = r - l + 1;
tr[u] = {l, r, len, len, len, len, 0};
//return;
} else {
int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
push_up(u);
}
}
//int l, r, sum, len, lmax, rmax, tag
void modify(int u, int tag, int l, int r,int L, int R) {
push_down(u);
if (L >= l && R <= r) {
if (tag == 1) {
//开房,区间作无效
tr[u].lmax = tr[u].rmax = tr[u].sum = 0;
} else {
//退房,区间作等长
tr[u].lmax = tr[u].rmax = tr[u].sum = tr[u].len;
}
tr[u].tag = tag;
return;
}
int mid = L + R >> 1;
if (l <= mid) modify(u << 1, tag, l, r, L, mid);
if (r > mid) modify(u << 1 | 1, tag, l, r, mid + 1, R);
push_up(u);
}
//int l, r, sum, len, lmax, rmax, tag;
int query(int u, int l, int r, int x) {
push_down(u);
if (l == r) {
return l;
}
int mid = l + r >> 1;
if (tr[u << 1].sum >= x) {
return query(u << 1, l, mid, x);
} else if (tr[u << 1].rmax + tr[u << 1 | 1].lmax >= x) {
return mid - tr[u << 1].rmax + 1;
} else {
return query(u << 1 | 1, mid + 1, r, x);
}
}
int main() {
scanf("%d%d", &n, &m);
build(1, 1, n);
int op, x, y;
while (m--) {
scanf("%d", &op);
if (op == 1) {
scanf("%d", &x);
if (tr[1].sum >= x) {
int L = query(1, 1, n, x);
printf("%d\n", L);
modify(1, 1, L, L + x - 1, 1, n);
} else {
printf("0\n");
}
} else {
scanf("%d%d", &x, &y);
modify(1, 2, x, x + y - 1, 1, n);
}
}
return 0;
}