单点更新,区间第K大的位置.
#include <iostream>
#include <cstdio>
#include <memory.h>
using namespace std;
#define lson l, m, rt << 1
#define rson m + 1, r, rt << 1 | 1
const int maxn = 70000;
int segs[maxn << 2], n, m;
void build(int l, int r, int rt){
if(l == r){
scanf("%d", &segs[rt]);
return;
}
int m = (l + r) >> 1;
build(lson),build(rson);
segs[rt] = segs[rt << 1] + segs[rt << 1 | 1];
}
void update(int p, int v,int l, int r, int rt){
if(l == r){
segs[rt] = v;
return ;
}
int m = (l + r) >> 1;
if(p <= m)update(p, v, lson);
else update(p, v, rson);
segs[rt] = segs[rt << 1] + segs[rt << 1 | 1];
}
int query(int k, int l, int r, int rt){
if(l == r){
return l;
}
int m = (l + r) >> 1;
if(k <= segs[rt << 1])return query(k, lson);
else return query(k - segs[rt << 1], rson);
segs[rt] = segs[rt << 1] + segs[rt << 1 | 1];
}
int main(){
while ( ~ scanf("%d", &n)){
build(1, n, 1);
char str[4];
scanf("%d", &m);
while (m--){
scanf("%s",str);
if(str[0] == 'p'){
int a, b;
scanf("%d%d", &a, &b);
update(a, b, 1, n, 1);
}else{
int k;
scanf("%d", &k);
printf("%d\n",query(k, 1, n, 1));
}
}
}
return 0;
}