T了,不知道什么原因。
#include<bits/stdc++.h>
using namespace std;
#define int long long
const int N = 5e5 + 5;
int minn[N << 2];
inline int read() {
int x = 0, m = 1;
char ch = getchar();
while(!isdigit(ch)) {
if(ch == '-') m = -1;
ch = getchar();
}
while(isdigit(ch)) {
x = x * 10 + ch - 48;
ch = getchar();
}
return x * m;
}
inline void write(int x) {
if(x < 0) {
putchar('-');
write(-x);
return;
}
if(x >= 10) write(x / 10);
putchar(x % 10 + '0');
}
namespace tree {
inline void PushUp(int x) {
minn[x] = min(minn[x << 1], minn[x << 1 | 1]);
}
inline void UpDate(int l, int r, int x, int aim, int C) {
if(l == r) {
minn[x] = min(minn[x], C);
return ;
}
int mid = l + r >> 1;
if(mid >= aim) UpDate(l, mid, x << 1, aim, C);
else UpDate(mid + 1, r, x << 1 | 1, aim, C);
PushUp(x);
}
inline int Query(int rt, int l, int r, int L, int R) {
if(l >= L && r <= R) return minn[rt];
int mid = (l + r) >> 1, ans = INT_MAX;
if(L <= mid) ans = min(Query(rt << 1, l, mid, L, R), ans);
if(R > mid) ans = min(ans, Query(rt << 1 | 1, mid + 1, r, L, R));
return ans;
}
}
namespace slove {
int m, n;
int main() {
m = read(), n = read();
for(int i = 1; i <= (m << 2); i ++) minn[i] = INT_MAX;
tree::UpDate(1, m, 1, 1, 0);
for(int i = 1; i <= n; i ++) {
int l = read(), r = read();
tree::UpDate(1, m, 1, r, tree::Query(1, 1, m, l, r) + 1);
}
write(tree::Query(1, 1, m, m, m));
putchar('\n');
}
}
signed main() {
int T = read();
while(T --) {
slove::main();
if(T) putchar('\n');
}
return 0;
}