RT,分块T了一半
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define rep(i , l , r) for(int i = l;i <= r;i++)
#define per(i , l , r) for(int i = r;i >= l;i--)
inline int read(){
int s = 0 , xi = 1;
char op = getchar();
while(op < '0' || op > '9'){
if(op == '-') xi = -1;
op = getchar();
}
while(op >= '0' && op <= '9'){
s = (s << 1) + (s << 3) + op - '0';
op = getchar();
}
return s * xi;
}
inline void print(int x){
if(x < 0) putchar('-') , x *= -1;
if(x < 10){
putchar(x + '0');
return;
}
print(x / 10);
putchar(x % 10 + '0');
}
set <int> d[1000005] , bk[1000005];
int op[1000005] , l[1000005] , r[10000005] , x[10000005];
int ll[1000005] , rr[1000005] , bel[1000005] , a[1000005] , len , cnt;
signed main(){
// ios::sync_with_stdio(0);
// cin.tie(0),cout.tie(0);
int n = read();
rep(i , 1 , n) a[i] = read() , d[i].insert(a[i]);
len = sqrt(n);
cnt = n / len + (bool) (n % len);
for(int i = 1 , j = 1;i <= n;i += len , j++){
rr[j - 1] = i - 1;
ll[j] = i;
for(int k = ll[j - 1];k <= rr[j - 1];k++) bel[k] = j - 1;
}
// cout << ll[1] << ' ' << rr[1] << endl;
rr[cnt] = n;
for(int i = ll[cnt];i <= rr[cnt];i++) bel[i] = cnt;
// for(int i = 1;i <= n;i++) cout << bel[i] << ' ';
// cout << endl;
int q = read();
rep(ii , 1 , q){
op[ii] = read();
if(op[ii] == 3){
int id = read();
int tmp = 0;
if(bk[bel[id]].size()) tmp = (*(bk[bel[id]].rbegin()));
// cout << tmp << ' ';
print(max(tmp , (*(d[id].rbegin()))));
putchar('\n');
// cerr << bel[id] << '\n';
}
if(op[ii] == 1){
l[ii] = read() , r[ii] = read() , x[ii] = read();
int s = l[ii] , t = r[ii];
for(int i = 1;i <= cnt;i++){
if(rr[i] < s || ll[i] > t) continue;
if(ll[i] >= s && rr[i] <= t){
// cout << i << ' ';
bk[i].insert(x[ii]);
continue;
}
for(int j = max(s , ll[i]);j <= min(t , rr[i]);j++){
d[j].insert(x[ii]);
}
}
// cout << "end\n";
}
if(op[ii] == 2){
int id = read();
int s = l[id] , t = r[id];
for(int i = 1;i <= cnt;i++){
if(rr[i] < s || ll[i] > t) continue;
if(ll[i] >= s && rr[i] <= t){
auto it = bk[i].lower_bound(x[id]);
if((*it) == x[id]) bk[i].erase(it);
continue;
}
for(int j = max(s , ll[i]);j <= min(t , rr[i]);j++){
auto it = d[j].lower_bound(x[id]);
if((*it) == x[id]) d[j].erase(it);
}
}
}
}
return 0;
}