隨意在書上挑了道題,結果是道簡單的二分題,隨手寫了。
題意:
有1到n 那個level 每一個level有a[i]只螞蟻
兩種操作
p a b 把第a個level的螞蟻數量改成b
q a 查詢第a只螞蟻在哪個level裏。
思路:要查的第x只螞蟻,滿足a[1]+a[2]+....+a[i-1]<x<a[1]+....a[i].所以1到n二分i就可以了,然後用線段樹維護前綴和即可,當然也可以用樹狀數組,我習慣寫線段樹。
代碼:
#include<iostream>
#include<stdio.h>
#include<string.h>
#define lson l,mid,rt<<1
#define rson mid+1,r,rt<<1|1
using namespace std;
const int maxn=100005;
int sum[maxn<<2];
void PushUP(int rt) {
sum[rt] = sum[rt<<1] + sum[rt<<1|1];
}
void build(int l,int r,int rt) {
if (l == r) {
scanf("%d",&sum[rt]);
return ;
}
int mid= (l + r) >> 1;
build(lson);
build(rson);
PushUP(rt);
}
void update(int p,int add,int l,int r,int rt) {
if (l == r) {
sum[rt] = add;
return ;
}
int mid= (l + r) >> 1;
if (p <= mid) update(p , add , lson);
else update(p , add , rson);
PushUP(rt);
}
int query(int L,int R,int l,int r,int rt) {
if (L <= l && r <= R) {
return sum[rt];
}
int mid= (l + r) >> 1;
int ret = 0;
if (L <= mid) ret += query(L , R , lson);
if (R > mid) ret += query(L , R , rson);
return ret;
}
int main(){
int n,m;
char a[10];
int x,y;
while(~scanf("%d",&n)){
build(1,n,1);
scanf("%d",&m);
for(int i=1;i<=m;i++){
scanf("%s",a);
if(a[0]=='p'){
scanf("%d%d",&x,&y);
update(x,y,1,n,1);
}
else{
scanf("%d",&x);
int l=1,r=n,mid;
int ans;
while(l<r){
mid=(l+r)>>1;
ans=query(1,mid,1,n,1);
if(ans<x) l=mid+1;
if(ans>=x) r=mid;
}
printf("%d\n",r);
}
}
}
return 0;
}