1 #define IOS ios_base::sync_with_stdio(0); cin.tie(0);
2 #include <cstdio>//sprintf islower isupper
3 #include <cstdlib>//malloc exit strcat itoa system("cls")
4 #include <iostream>//pair
5 #include <fstream>//freopen("C:\Users\13606\Desktop\Input.txt","r",stdin);
6 #include <bitset>
7 //#include <map>
8 //#include<unordered_map>
9 #include <vector>
10 #include <stack>
11 #include <set>
12 #include <string.h>//strstr substr strcat
13 #include <string>
14 #include <time.h>// srand(((unsigned)time(NULL))); Seed n=rand()%10 - 0~9;
15 #include <cmath>
16 #include <deque>
17 #include <queue>//priority_queue<int, vector<int>, greater<int> > q;//less
18 #include <vector>//emplace_back
19 //#include <math.h>
20 #include <cassert>
21 #include <iomanip>
22 //#include <windows.h>//reverse(a,a+len);// ~ ! ~ ! floor
23 #include <algorithm>//sort + unique : sz=unique(b+1,b+n+1)-(b+1);+nth_element(first, nth, last, compare)
24 using namespace std;//next_permutation(a+1,a+1+n);//prev_permutation
25 //******************
26 clock_t __START,__END;
27 double __TOTALTIME;
28 void _MS(){__START=clock();}
29 void _ME(){__END=clock();__TOTALTIME=(double)(__END-__START)/CLOCKS_PER_SEC;cout<<"Time: "<<__TOTALTIME<<" s"<<endl;}
30 //***********************
31 #define rint register int
32 #define fo(a,b,c) for(rint a=b;a<=c;++a)
33 #define fr(a,b,c) for(rint a=b;a>=c;--a)
34 #define mem(a,b) memset(a,b,sizeof(a))
35 #define pr printf
36 #define sc scanf
37 #define ls rt<<1
38 #define rs rt<<1|1
39 typedef pair<int,int> PII;
40 typedef vector<int> VI;
41 typedef long long ll;
42 const double E=2.718281828;
43 const double PI=acos(-1.0);//
44 const ll INF=(1LL<<60);
45 const int inf=(1<<30);
46 const double ESP=1e-9;
47 const int mod=(int)1e9+7;
48 const int N=(int)4e6+10;
49
50 int ans[N],a[N];
51 int c[N],maxn;
52 int lowbit(int n){return n&(-n);}
53 void add(int i,int t)
54 {
55 while(i<=maxn)
56 {
57 c[i]+=t;
58 i+=lowbit(i);
59 }
60 }
61 int Sum(int i)
62 {
63 int sum=0;
64 while(i)
65 {
66 sum+=c[i];
67 i-=lowbit(i);
68 }
69 return sum;
70 }
71 struct node
72 {
73 int l,r,k,id,currk,op;
74 }q[N],temp[N];
75 void Init()
76 {
77 for(int i=0;i<=N-3;++i)
78 c[i]=0;
79 }
80
81 void solve(int l,int r,int ql,int qr)
82 {
83 if(ql>qr)return;
84 int L=ql,R=qr,mid=l+r>>1;
85
86 if(l==r)
87 {
88 for(int i=ql;i<=qr;++i)
89 if(q[i].op==3)
90 ans[q[i].id]=l;//答案
91 return;
92 }
93 for(int i=ql;i<=qr;++i)
94 {
95 if(q[i].op!=3)temp[q[i].r<=mid?L++:R--]=q[i];//分位置
96
97 if(q[i].op==1&&q[i].r<=mid)add(q[i].l,1);//q.l才是要加的位置,q.r是值
98 else if(q[i].op==2&&q[i].r<=mid)add(q[i].l,-1);
99 else if(q[i].op==3)
100 {
101 int sum=Sum(q[i].r)-Sum(q[i].l-1);//二分是保证按时间顺序来的,直接计算就行
102 if(q[i].currk+sum>=q[i].k)temp[L++]=q[i];//分位置
103 else q[i].currk+=sum,temp[R--]=q[i];
104 }
105 }
106 for(int i=ql;i<=qr;++i)//清空-树状数组
107 {
108 if(q[i].op==1&&q[i].r<=mid)add(q[i].l,-1);
109 else if(q[i].op==2&&q[i].r<=mid)add(q[i].l,1);
110 }
111 //还原
112 for(int i=ql;i<=L-1;++i)
113 q[i]=temp[i];
114 for(int i=qr,j=L;j<=qr;--i,++j)
115 q[j]=temp[i];
116
117 //递归下去
118 if(L>ql)solve(l,mid,ql,L-1);
119 if(R<qr)solve(mid+1,r,R+1,qr);
120 }
121
122 int main()
123 {
124 int n,m;
125 while(~sc("%d",&n))
126 {
127 // Init();
128 maxn=n;
129 for(int i=1;i<=n;++i)
130 sc("%d",&q[i].r),q[i].l=i,a[i]=q[i].r,q[i].op=1;
131 sc("%d",&m);
132 int ask=0;
133 for(int i=1;i<=m;++i)
134 {
135 int J;
136 sc("%d",&J);
137 if(J==1)
138 {
139 int pos,x;
140 sc("%d%d",&pos,&x);
141 ++n;
142 q[n].l=pos,q[n].r=a[pos],q[n].op=2;//del
143 ++n,a[pos]=x;
144 q[n].l=pos,q[n].r=a[pos],q[n].op=1;//add
145 }
146 else
147 ++n,sc("%d%d%d",&q[n].l,&q[n].r,&q[n].k),q[n].currk=0,q[n].id=++ask,q[n].op=3;//query
148 }
149 solve(0,inf,1,n);
150 for(int i=1;i<=ask;++i)
151 pr("%d
",ans[i]);
152 }
153 return 0;
154 }
155
156 /**************************************************************************************/