题目链接
#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;
}
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】