#include <bits/stdc++.h>
using namespace std;
#define ls(p) (p << 1)
#define rs(p) (p << 1 | 1)
const int N = 5e5 + 5;
namespace sgt
{
struct va
{
int maxx, lmax, rmax;
};
struct node
{
va val;
int tag = -1;
} t[N << 2];
void pushup(int p, int ln, int rn)
{
t[p].val.maxx = max({t[ls(p)].val.maxx, t[rs(p)].val.maxx, t[rs(p)].val.lmax + t[ls(p)].val.rmax});
t[p].val.lmax = t[ls(p)].val.lmax + (t[ls(p)].val.maxx == rn - ln + 1) * t[rs(p)].val.maxx;
t[p].val.rmax = t[rs(p)].val.rmax + (t[rs(p)].val.maxx == rn - ln + 1) * t[ls(p)].val.maxx;
}
void addtag(int p, int l, int r, int val)
{
if (t[p].tag == 1)
t[p].val = {0, 0, 0};
else
t[p].val = {r - l + 1, r - l + 1, r - l + 1};
t[p].tag = val;
}
void pushdown(int p, int l, int r)
{
if (t[p].tag == -1)
return;
int mid = (l + r) >> 1;
addtag(ls(p), l, mid, t[p].tag);
addtag(rs(p), mid + 1, r, t[p].tag);
// t[ls(p)].tag = t[rs(p)].tag = t[p].tag=-1;
t[p].tag = -1;
}
void build(int p, int l, int r)
{
if (l == r)
{
t[p].val = {1, 1, 1};
return;
}
int mid = (l + r) >> 1;
build(ls(p), l, mid);
build(rs(p), mid + 1, r);
pushup(p, l, r);
}
void update(int p, int l, int r, int L, int R, int val)
{
if (L <= l && r <= R)
{
addtag(p, l, r, val);
return;
}
pushdown(p, l, r);
int mid = (l + r) >> 1;
if (L <= mid)
update(ls(p), l, mid, L, R, val);
if (R > mid)
update(rs(p), mid + 1, r, L, R, val);
pushup(p, l, r);
}
int query(int p, int l, int r, int val)
{
pushdown(p, l, r);
if (l == r)
return l;
int mid = (l + r) >> 1;
if (t[ls(p)].val.maxx >= val)
return query(ls(p), l, mid, val);
else if (t[ls(p)].val.rmax + t[rs(p)].val.lmax >= val)
return mid - t[ls(p)].val.rmax + 1;
else
return query(rs(p), mid + 1, r, val);
}
};
using namespace sgt;
int main()
{
int n, m, ans = 0;
cin >> n >> m;
build(1, 1, n);
while (m--)
{
char op;
cin >> op;
if (op == 'A')
{
int x;
cin >> x;
if (t[1].val.maxx < x)
ans++;
else
{
int pos = query(1, 1, n, x);
update(1, 1, n, pos, pos + x - 1, 1);
}
}
else
{
int l, r;
cin >> l >> r;
update(1, 1, n, l, r, 0);
}
}
cout << ans << endl;
return 0;
}
样例都过不去