//题解:如果第j个操作在第i个操作后面且rj>=ri,则第i个操作可视为无效操作,根据操作区间长度
//建立一个递减的单调栈,只需改变相差区间的数的排列顺序
#include<iostream>
#include<algorithm>
using namespace std;
const int maxn=200005;
long long a[maxn],b[maxn];
int q[maxn],t[maxn],r[maxn];
int main()
{
int n,m;
cin>>n>>m;
int i,j;
for(i=1;i<=n;i++)
{
cin>>a[i];
b[i]=a[i];
}
for(i=0;i<m;i++)
{
cin>>t[i]>>r[i];
}
int head=0,tail=0;//队列首尾指针,初始为空
q[0]=0;//存储元素的下标,初始时存入首元素的下标0
for(i=1;i<m;i++)
{
while(head<=tail&&r[i]>=r[q[tail]])//建立严格单调递减的队列
tail--;
q[++tail]=i;//存储入队元素下标
}
int tmp=r[q[0]];//最长的区间
sort(b+1,b+1+tmp);//作为参照从小到大排好序的数组
int lb=1,rb=tmp;
q[++tail]=m,r[m]=0;//最后一组元素要排序(此处注意)
for(i=1;i<=tail;i++)
{
for(j=r[q[i-1]];j>r[q[i]];j--)
{
if(t[q[i-1]]==1) { a[j]=b[rb--];}
else { a[j]=b[lb++];}
}
}
for(i=1;i<=n;i++)
cout<<a[i]<<' ';
cout<<endl;
return 0;
}
codeforces 631C Report(单调栈)
最新推荐文章于 2025-01-15 22:19:39 发布