zoj 3279 ants(セグメントツリー区間位置クエリー)
1608 ワード
タイトルリンク:クリックしてリンクを開く
セグメントツリーの単点修正区間位置クエリー
コード:
セグメントツリーの単点修正区間位置クエリー
コード:
#include <cstdio>
#include <cstring>
#include <iostream>
using namespace std;
#define lson l,m,rt<<1
#define rson m+1,r,rt<<1|1
#define MAX 100010
int sum[MAX<<2];
int a[MAX];
void pushup(int rt){
sum[rt]=sum[rt<<1]+sum[rt<<1|1];
}
void build(int l,int r,int rt){
sum[rt]=0;
if(l==r) return ;
int m=(l+r)>>1;
build(lson);
build(rson);
pushup(rt);
}
void update(int l,int r,int rt,int p,int d){
if(l==r) {
sum[rt]=d;
return ;
}
int m=(l+r)>>1;
if(m>=p) update(lson,p,d);
else update(rson,p,d);
pushup(rt);
}
int query(int l,int r,int rt,int n){
if(l==r) return l;
int m=(l+r)>>1;
if(sum[rt<<1]>=n) return query(lson,n);
else return query(rson,n-sum[rt<<1]);
}
int main(){
int N;
while(~scanf("%d",&N)){
build(1,N,1);
for(int i=1;i<=N;i++){
int t;
scanf("%d",&a[i]);
update(1,N,1,i,a[i]);
}
int q;
scanf("%d",&q);
char s[5];
int x,y;
for(int i=1;i<=q;i++){
scanf("%s",s);
if(s[0]=='q'){
scanf("%d",&x);
printf("%d
",query(1,N,1,x));
}
else{
scanf("%d%d",&x,&y);
update(1,N,1,x,y);
}
}
}
return 0;
}