简单线段树。改变level的数量,询问第几个的level是多少。
#include <queue> #include <stack> #include <math.h> #include <stdio.h> #include <stdlib.h> #include <iostream> #include <limits.h> #include <string.h> #include <string> #include <algorithm> #define MID(x,y) ( ( x + y ) >> 1 ) #define L(x) ( x << 1 ) #define R(x) ( x << 1 | 1 ) #define BUG puts("here!!!") using namespace std; const int MAX = 100010; struct Tnode{ int l,r; long long sum;}; Tnode node[MAX<<2]; int a[MAX]; void init() { memset(node,0,sizeof(node)); } void Build(int t,int l,int r) { node[t].l = l; node[t].r = r; if( node[t].l == node[t].r - 1 ) { node[t].sum = a[l]; return ; } int mid = MID(l,r); Build(L(t),l,mid); Build(R(t),mid,r); node[t].sum = node[L(t)].sum + node[R(t)].sum; } void Updata(int t,int l,int r,int val) { if( node[t].l >= l && node[t].r <= r ) { node[t].sum = val; return ; } if( node[t].l == node[t].r - 1 ) return ; int mid = MID(node[t].l,node[t].r); if( l <= mid ) Updata(L(t),l,r,val); if( r > mid ) Updata(R(t),l,r,val); node[t].sum = node[L(t)].sum + node[R(t)].sum; } int Query(int t,int len) { if( node[t].l == node[t].r - 1 ) return node[t].r; int mid = MID(node[t].l,node[t].r); if( len <= node[L(t)].sum ) return Query(L(t),len); else return Query(R(t),len - node[L(t)].sum); } int main() { int n,m,x,y; char ch[4]; while( ~scanf("%d",&n) ) { for(int i=0; i<n; i++) scanf("%d",&a[i]); init(); Build(1,0,n); scanf("%d",&m); while( m-- ) { scanf("%s",ch); if( ch[0] == 'p' ) { scanf("%d%d",&x,&y); Updata(1,x-1,x,y); } else { scanf("%d",&x); int pos = Query(1,x); printf("%d\n",pos); } } } return 0; }