思路:离线+思维
用一个
l
a
s
t
[
x
]
=
i
last[x]=i
last[x]=i数组维护第
i
i
i次操作将
a
[
x
]
=
y
a[x]=y
a[x]=y
用一个
b
[
i
]
b[i]
b[i]数组维护第i次操作后操作2造成的此时
a
[
i
]
a[i]
a[i]的改变,可以从最后一次往前遍历,显然满足
b
[
i
]
=
m
a
x
(
b
[
i
]
,
b
[
i
+
1
]
)
b[i]=max(b[i],b[i+1])
b[i]=max(b[i],b[i+1])
最后第
i
i
i个数的值为:
m
a
x
(
a
[
i
]
,
b
[
l
a
s
t
[
i
]
]
)
max(a[i],b[last[i]])
max(a[i],b[last[i]])
#include <bits/stdc++.h>
using namespace std;
#define IOS ios::sync_with_stdio(false),cin.tie(0),cout.tie(0);
#define endl '\n';
typedef long long ll;
typedef pair<int,int> PII;
const int N=1e6+10,mod=1e9+7;
int n,q,a[N],b[N],last[N];
int main(){
IOS;
cin>>n>>q;
for(int i=1;i<=n;++i) cin>>a[i];
for(int i=1;i<=q;i++){
int op;cin>>op;
if(op==1){
int x,y;cin>>x>>y;
a[x]=y;
last[x]=i;
}else{
int y;cin>>y;
b[i]=y;
}
}
for(int i=q-1;i>=0;i--) b[i]=max(b[i],b[i+1]);
for(int i=1;i<=n;i++) cout<<max(a[i],b[last[i]])<<" ";
return 0;
}