题目大意:给一个序列,进行m次操作,每次操作对[1,r]进行升序or降序,输出最终序列。
思路:不难发现,对于每个区间 [ri+1+1,ri] 只有第i次操作对此区间有作用,并且当
ri>rj,i>j 时,第j次操作其实是没有用的,因此,用两个数组op和t,
op[y]=x,表示对区间[1,y]的操作是x;
t[y]=i,表示对区间[1,y]的操作是第i次;
然后假设所有操作r最大为r_max,那么就从r_max开始倒序维护区间。
/* ***********************************************
┆ ┏┓ ┏┓ ┆
┆┏┛┻━━━┛┻┓ ┆
┆┃ ┃ ┆
┆┃ ━ ┃ ┆
┆┃ ┳┛ ┗┳ ┃ ┆
┆┃ ┃ ┆
┆┃ ┻ ┃ ┆
┆┗━┓ 马 ┏━┛ ┆
┆ ┃ 勒 ┃ ┆
┆ ┃ 戈 ┗━━━┓ ┆
┆ ┃ 壁 ┣┓┆
┆ ┃ 的草泥马 ┏┛┆
┆ ┗┓┓┏━┳┓┏┛ ┆
┆ ┃┫┫ ┃┫┫ ┆
┆ ┗┻┛ ┗┻┛ ┆
************************************************ */
#include <stdio.h>
#include <string.h>
#include <iostream>
#include <algorithm>
#include <vector>
#include <queue>
#include <stack>
#include <set>
#include <map>
#include <string>
#include <math.h>
#include <stdlib.h>
using namespace std;
#define rep(i,a,b) for (int i=(a),_ed=(b);i<_ed;i++)
#define per(i,a,b) for (int i=(b)-1,_ed=(a);i>=_ed;i--)
#define inf 0x3f3f3f3f
#define mod 1000000007
#define ll long long
#define ull unsigned long long
#define N 200005
int t[N],op[N],ans[N];
int a[N];
int n,m;
int main()
{
//freopen("in.txt","r",stdin);
//freopen("out.txt","w",stdout);
int x,y;
scanf("%d%d",&n,&m);
for(int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(int i=1;i<=m;i++)
{
scanf("%d%d",&x,&y);
op[y]=x;
t[y]=i;
}
int len=n;
for(;len;len--)
{
if(op[len])break;
ans[len]=a[len];
}
sort(a+1,a+1+len);
int l=1,r=len;
int nowtime=0,nowop=0;
for(int i=len;i>=1;i--)
{
if(t[i]>nowtime)
{
nowtime=t[i];
nowop=op[i];
}
if(nowop==1)ans[i]=a[r--];
else ans[i]=a[l++];
}
for(int i=1;i<=n;i++)
printf("%d ",ans[i]);
printf("\n");
return 0;
}