解题思路:建立1000棵树状数组维护一下即可。
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <vector>
#include <deque>
#include <queue>
#include <stack>
#include <map>
#include <set>
#include <iostream>
#include <algorithm>
using namespace std;
const int maxn = 1010;
int tree[1001][10010];
int arr[10010];
int T, n, q;
void init() {
memset(tree, 0, sizeof(tree));
}
int lowbit(int x) {
return x & (-x);
}
void add(int id, int x, int c) {
for(int i = x; i <= n; i += lowbit(i)) {
tree[id][i] += c;
}
return ;
}
int getsum(int id, int x) {
int res = 0;
for(int i = x; i > 0; i -= lowbit(i)) {
res += tree[id][i];
}
return res;
}
int main() {
/* Enter your code here. Read input from STDIN. Print output to STDOUT */
int op, l, r, k, x;
scanf("%d", &T);
while(T--) {
scanf("%d", &n);
init();
for(int i = 1; i <= n; ++i) {
scanf("%d", &arr[i]);
add(arr[i], i, 1);
}
scanf("%d", &q);
for(int i = 0; i < q; ++i) {
scanf("%d", &op);
if(op == 0) {
scanf("%d %d %d", &l, &r, &k);
int id = 1;
while(true) {
k -= (getsum(id, r) - getsum(id, l-1));
if(k <= 0) break;
id++;
}
printf("%d\n", id);
} else {
scanf("%d %d", &x, &k);
add(arr[x], x, -1);
add(k, x, 1);
arr[x] = k;
}
}
}
return 0;
}