#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef long double ld;
typedef unsigned long long ull;
struct Act {
int op, x, v;
} act[200005];
int n, q;
int a[8005];
// f1 维护小于i的数的数量。
int f1[20005];
// f2 维护下标小于j的数中i的数量。(第一维是i, 第二维是j)
int f2[20005][8005];
int b[200005], bl;
int lowbit(int x) {
return x & -x;
}
void update1(int l, int x) {
while (l <= n + 5006) {
f1[l] += x;
l += lowbit(l);
}
}
void update2(int l, int x, int i) {
while (l <= n + 5006) {
f2[i][l] += x;
l += lowbit(l);
}
}
int get1(int i) {
int ans = 0;
while (i) {
ans += f1[i];
i -= lowbit(i);
}
return ans;
}
int get2(int i, int j) {
int ans = 0;
while (j) {
ans += f2[i][j];
j -= lowbit(j);
}
return ans;
}
int main()
{
scanf("%d%d", &n, &q);
for (int i = 1; i <= n; i++) {
scanf("%d", &a[i]);
b[++bl] = a[i];
}
for (int i = 1; i <= q; i++) {
scanf("%d%d", &act[i].op, &act[i].x);
if (act[i].op == 1) {
scanf("%d", &act[i].v);
b[++bl] = act[i].v;
}
}
sort(b + 1, b + bl + 1);
bl = unique(b + 1, b + bl + 1) - b;
for (int i = 1; i <= n; i++) {
a[i] = lower_bound(b + 1, b + bl, a[i]) - b;
}
for (int i = 1; i <= q; i++) {
if (act[i].op == 1) {
act[i].v = lower_bound(b + 1, b + bl, act[i].v) - b;
}
}
for (int i = 1; i <= n; i++) {
update1(a[i] + 1, 1);
update2(i + 1, 1, a[i]);
}
for (int i = 1; i <= q; i++) {
if (act[i].op == 1) {
int x = act[i].x, v = act[i].v;
update1(a[x] + 1, -1);
update1(v + 1, 1);
update2(x + 1, -1, a[x]);
update2(x + 1, 1, v);
a[x] = v;
}
else {
int x = act[i].x;
printf("%d\n", get1(a[x]) + get2(a[x], x) + 1);
}
}
return 0;
}
为什么CSP-J的橙题考这个???