1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
|
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define ls rt<<1
#define rs ls|1
#define mid ((l+r)>>1)
const int N=5e5+5;
int n,m,q;
struct node
{
int op,l,r,x;
}a[N],b[N];
int v[N];
vector<int> Q[N];
int tr[N<<2],lz[N<<2],Id[N];
int pre[N][30],nxt[N][30];
void pushup(int rt) { tr[rt]=max(tr[ls],tr[rs]); }
void build(int rt,int l,int r)
{
lz[rt]=0;
if(l==r)
return tr[rt]=v[l],void();
build(ls,l,mid),build(rs,mid+1,r);
pushup(rt);
}
void pushdown(int rt)
{
tr[ls]=max(tr[ls],lz[rt]);
lz[ls]=max(lz[ls],lz[rt]);
tr[rs]=max(tr[rs],lz[rt]);
lz[rs]=max(lz[rs],lz[rt]);
}
void upd(int rt,int l,int r,int lf,int rg,int x)
{
if(lf<=l&&r<=rg)
return tr[rt]=lz[rt]=x,void();
if(lf>r||l>rg)
return;
pushdown(rt);
if(lf<=mid)
upd(ls,l,mid,lf,rg,x);
if(mid<rg)
upd(rs,mid+1,r,lf,rg,x);
pushup(rt);
}
int qry(int rt,int l,int r,int lf,int rg)
{
if(lf<=l&&r<=rg)
return tr[rt];
if(lf>r||l>rg)
return 0;
int res=0;
pushdown(rt);
if(lf<=mid)
res=qry(ls,l,mid,lf,rg);
if(mid<rg)
res=max(res,qry(rs,mid+1,r,lf,rg));
return res;
}
signed main()
{
scanf("%lld%lld",&n,&m);
for(int i=1;i<=n;i++)
scanf("%lld",&v[i]);
for(int i=1;i<=m;i++)
scanf("%lld%lld",&b[i].l,&b[i].r);
scanf("%lld",&q);
for(int i=1;i<=q;i++){
scanf("%lld%lld%lld",&a[i].op,&a[i].l,&a[i].r);
if(a[i].op==2)
scanf("%lld",&a[i].x),Q[a[i].r].emplace_back(i);
}
for(int i=1;i<=m;i++){
pre[i][0]=qry(1,1,n,b[i].l,b[i].l);
nxt[i][0]=qry(1,1,n,b[i].r,b[i].r);
upd(1,1,n,b[i].l,b[i].r,i);
for(int j:Q[i])
Id[j]=qry(1,1,n,a[j].x,a[j].x);
}
for(int j=1;j<=21;j++)
for(int i=1;i<=m;i++){
pre[i][j]=pre[pre[i][j-1]][j-1];
nxt[i][j]=nxt[nxt[i][j-1]][j-1];
}
build(1,1,n);
for(int i=1;i<=q;i++){
if(a[i].op==1){
upd(1,1,n,a[i].l,a[i].l,a[i].r);
v[a[i].l]=a[i].r;
continue;
}
if(Id[i]<a[i].l){
printf("%lld\n",v[a[i].x]);
continue;
}
int l=Id[i],r=Id[i];
for(int j=21;~j;j--){
if(pre[l][j]>=a[i].l)
l=pre[l][j];
if(nxt[r][j]>=a[i].l)
r=nxt[r][j];
}
printf("%lld\n",qry(1,1,n,b[l].l,b[r].r));
}
return 0;
}
|