珂朵莉树

题目链接

#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;
}
posted @   duoluoluo  阅读(31)  评论(0编辑  收藏  举报
相关博文:
阅读排行:
· 地球OL攻略 —— 某应届生求职总结
· 周边上新:园子的第一款马克杯温暖上架
· Open-Sora 2.0 重磅开源!
· 提示词工程——AI应用必不可少的技术
· .NET周刊【3月第1期 2025-03-02】
点击右上角即可分享
微信分享提示