题目链接
#include <iostream>
#include <cstdio>
#include <set>
using namespace std;
const int N = 100010;
int t, n, m, a[N], ans[N];
struct P {
int l, r, val;
P(int L, int R = -1, int Val = 0) : l(L), r(R), val(Val) {}
bool friend operator < (P x, P y) {
return x.l < y.l;
}
};
set<P> s;
inline auto split (int p) {
if (p > n) return s.end();
auto it = s.lower_bound(P(p));
if (it != s.end() && it -> l == p) return it;
it --;
int l = it -> l, r = it -> r, v = it -> val;
s.erase(it);
s.insert(P(l, p - 1, v));
return s.insert(P(p, r, v)).first;
}
inline void assign (int l, int r, int v) {
auto itr = split(r + 1), itl = split(l);
s.erase(itl, itr);
s.insert(P(l, r, v));
}
int main () {
scanf("%d", &t);
while (t --) {
scanf("%d%d", &n, &m);
s.clear();
for (int i = 1; i <= n; i ++) scanf("%d", &a[i]);
int h = a[1], l = 1;
for (int i = 1; i <= n; i ++) {
if (a[i] < h) {
s.insert(P(l, i - 1, h));
l = i;
h = a[i];
}
}
s.insert(P(l, n, h));
for (int i = 1; i <= m; i ++) {
int k, d;
scanf("%d%d", &k, &d);
a[k] -= d;
auto it = s.lower_bound(P(k));
if (it == s.end()) it --;
else if (it -> l > k) it --;
if (it -> val > a[k]) {
auto lt = split(k);
int l = lt -> l, r = lt -> r, v = a[k];
lt ++;
for (auto x = lt; x != s.end(); x ++) {
if (x -> val < v) break;
r = x -> r;
}
assign(l, r, v);
}
ans[i] = s.size();
}
for (int i = 1; i <= m; i ++) printf("%d ", ans[i]);
printf("\n");
}
return 0;
}