2553
其他 C++ 公开

avatar Godzilla 发布于 2026-10-05 23:10 更新于 2026-10-05 23:10
返回
2553.cpp
#include <iostream>
using namespace std;

int n, q;
int a[8005];
int rk[8005];   // rk[i]:a[i]排序后所处的位置

// 值为p、下标为x的元素,是否排在值为r、下标为y的元素前面
bool front(int p, int x, int r, int y) {
    if (p != r) return p < r;   // 值小的在前
    return x < y;               // 值一样,下标小的在前(稳定排序)
}

int main() {
    ios::sync_with_stdio(false);
    cin.tie(0);

    cin >> n >> q;
    for (int i = 1; i <= n; i++) cin >> a[i];

    // 初始化:对每个i,数有多少个元素排在它前面
    for (int i = 1; i <= n; i++) {
        rk[i] = 1;
        for (int j = 1; j <= n; j++) {
            if (j != i && front(a[j], j, a[i], i)) rk[i]++;
        }
    }

    while (q--) {
        int op;
        cin >> op;
        if (op == 1) {
            int x, v;
            cin >> x >> v;
            int old = a[x];     // 修改前的值
            a[x] = v;           // 修改

            // 先重新算x自己的位置
            rk[x] = 1;
            for (int i = 1; i <= n; i++) {
                if (i != x && front(a[i], i, a[x], x)) rk[x]++;
            }

            // 再修正别的元素
            for (int i = 1; i <= n; i++) {
                if (i == x) continue;
                bool before = front(old, x, a[i], i);   // 修改前,x在i前面吗
                bool after  = front(v, x, a[i], i);     // 修改后,x在i前面吗
                if (!before && after) rk[i]++;          // 新增了一个排在前面的
                if (before && !after) rk[i]--;          // 少了一个排在前面的
            }
        } else {
            int x;
            cin >> x;
            cout << rk[x] << "\n";   // O(1)直接回答
        }
    }
    return 0;
}
wzs_oj@kernel:~ — wzs-sh
guest@wzsoj:~$
刷新页面 F5
复制 Ctrl+C
粘贴 Ctrl+V
搜索题目
训练中心
站点公告
今日神谕
CSP 倒计时
排行榜
我的提交
Esc 关闭 Enter 跳转 支持模糊匹配数字