http://codeforces.com/problemset/problem/1198/B
There is a country with n citizens. The i-th of them initially has ai money. The government strictly controls the wealth of its citizens. Whenever a citizen makes a purchase or earns some money, they must send a receipt to the social services mentioning the amount of money they currently have.
Sometimes the government makes payouts to the poor: all citizens who have strictly less money than x are paid accordingly so that after the payout they have exactly x money. In this case the citizens don’t send a receipt.
You know the initial wealth of every citizen and the log of all events: receipts and payouts. Restore the amount of money each citizen has after all events.
Input
The first line contains a single integer n (1≤n≤2⋅105) — the numer of citizens.
The next line contains n integers a1, a2, …, an (0≤ai≤109) — the initial balances of citizens.
The next line contains a single integer q (1≤q≤2⋅105) — the number of events.
Each of the next q lines contains a single event. The events are given in chronological order.
Each event is described as either 1 p x (1≤p≤n, 0≤x≤109), or 2 x (0≤x≤109). In the first case we have a receipt that the balance of the p-th person becomes equal to x. In the second case we have a payoff with parameter x.
Output
Print n integers — the balances of all citizens after all events.
Examples
Input
4
1 2 3 4
3
2 3
1 2 2
2 1
Output
3 2 3 4
Input
5
3 50 2 1 10
3
1 2 0
2 8
1 3 20
Output
8 8 20 8 10
Note
In the first example the balances change as follows: 1 2 3 4 → 3 3 3 4 → 3 2 3 4 → 3 2 3 4
In the second example the balances change as follows: 3 50 2 1 10 → 3 0 2 1 10 → 8 8 8 8 10 → 8 8 20 8 10
线段树,两种操作,1.单点修改 2.将数组中所有小于x的数改成x,
一开始想只记录最小值,第二个操作的时候如果最小值大于x直接return,不然暴力修改,然后很明显会TLE。。。还是要用lazy数组,第二个操作的时候区间修改
#include<stdio.h>
#include<algorithm>
#include<string.h>
#define maxn 200005
using namespace std;
int n,q,mi[maxn<<2],lazy[maxn<<2];
void pushup(int k)
{
mi[k]=min(mi[k<<1],mi[k<<1|1]);
}
void pushdown(int k)
{
if(lazy[k]>=0)
{
mi[k<<1]=max(mi[k<<1],lazy[k]);
mi[k<<1|1]=max(mi[k<<1|1],lazy[k]);
lazy[k<<1]=max(lazy[k<<1],lazy[k]);
lazy[k<<1|1]=max(lazy[k<<1|1],lazy[k]);
lazy[k]=-1;
}
}
void build(int k,int l,int r)
{
if(l==r)
{
scanf("%d",mi+k);
return ;
}
int mid=(l+r)/2;
build(k<<1,l,mid);
build(k<<1|1,mid+1,r);
pushup(k);
}
void set(int k,int l,int r,int loc,int x)
{
if(l==r)
{
mi[k]=x;
return ;
}
pushdown(k);
int mid=(l+r)/2;
if(loc<=mid)
set(k<<1,l,mid,loc,x);
else
set(k<<1|1,mid+1,r,loc,x);
pushup(k);
}
void oporate(int k,int x)
{
if(mi[k]>=x)
return;
mi[k]=x;
lazy[k]=max(lazy[k],x);
}
void query(int k,int l,int r)
{
if(l==r)
{
printf("%d ",mi[k]);
return ;
}
pushdown(k);
int mid=(l+r)/2;
query(k<<1,l,mid);
query(k<<1|1,mid+1,r);
}
int main()
{
scanf("%d",&n);
build(1,1,n);
scanf("%d",&q);
int op,loc,x;
memset(lazy,-1,sizeof(lazy));
while(q--)
{
scanf("%d",&op);
if(op==1)
{
scanf("%d%d",&loc,&x);
set(1,1,n,loc,x);
}
else
{
scanf("%d",&x);
oporate(1,x);
}
}
query(1,1,n);
}