Submission #1220207

#TimeUsernameProblemLanguageResultExecution timeMemory
1220207duckindogEmployment (JOI16_employment)C++20
100 / 100
138 ms6360 KiB
#include <bits/stdc++.h>

using namespace std;

const int N = 200'000 + 10;
int n, q;
int a[N];
struct { 
    int type, x, y;
} query[N];

vector<int> allValue;
namespace BIT { 
    int bit[N << 1];
    inline void upd(int i, int x) { 
        for (; i; i -= i & -i) bit[i] += x;
    }
    inline int que(int i) { 
        int ret = 0;
        for (; i <= (int)allValue.size(); i += i & -i) ret += bit[i];
        return ret;
    }
}

int32_t main() { 
    cin.tie(0)->sync_with_stdio(0);

    cin >> n >> q;
    for (int i = 1; i <= n; ++i) cin >> a[i];
    for (int i = 1; i <= q; ++i) { 
        auto& [type, x, y] = query[i];
        cin >> type;
        if (type == 1) cin >> x;
        else cin >> x >> y;
    }

    allValue.assign(a + 1, a + n + 1);
    for (int i = 1; i <= q; ++i) { 
        if (query[i].type == 2) allValue.push_back(query[i].y);
    }
    sort(allValue.begin(), allValue.end());
    allValue.erase(unique(allValue.begin(), allValue.end()), allValue.end());

    for (int i = 1; i <= n; ++i) { 
        a[i] = upper_bound(allValue.begin(), allValue.end(), a[i]) - allValue.begin();
    }

    auto modify = [&](int p, int x) { 
        BIT::upd(a[p], x);
        if (p > 1 && a[p - 1] >= a[p]) BIT::upd(a[p], -x);
        if (p < n && a[p + 1] > a[p]) BIT::upd(a[p], -x);
    };
    for (int i = 1; i <= n; ++i) modify(i, 1);

    for (int i = 1; i <= q; ++i) { 
        auto [type, x, y] = query[i];

        if (type == 1) { 
            x = lower_bound(allValue.begin(), allValue.end(), x) - allValue.begin() + 1;
            cout << BIT::que(x) << "\n";
        } else { 
            y = upper_bound(allValue.begin(), allValue.end(), y) - allValue.begin();

            modify(x, -1);
            if (x > 1) modify(x - 1, -1);
            if (x < n) modify(x + 1, -1);
            a[x] = y;
            modify(x, 1);
            if (x > 1) modify(x - 1, 1);
            if (x < n) modify(x + 1, 1);
        }
    }
}
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...