题目描述:给你n个数每次排前m个数(可能降序可能升序)问你最后出来是什么样子的;
分析:它的顺序只跟后面最大的m有关  比如3   4  那么前三个不管怎么排对我排前4个都没影响  
            总结下这种规律题,首先多用电脑去找规律 ,也就是打表,其次一般都有很多条件什么的,找规律也就是把条件逐一合并,到最后容易实现
ac代码:
#include<bits/stdc++.h>
using namespace std;
typedef pair<int ,int>  P;
int a[200004];
int b[200004];
int main(){
//    freopen("1.txt","r",stdin);
    int n,m;
    cin>>n>>m;
    vector<P> sta;
    for(int i=1;i<=n;i++)cin>>a[i];
    for(int i=1;i<=m;i++){
        int x,y;
        cin>>x>>y;
        while(!sta.empty()&&sta.back().second<=y) sta.pop_back();
        sta.push_back(make_pair(x,y));
    }
    if(m!=1||sta[0].first==1)sort(a+1,a+sta[0].second+1,less<int>());
    else sort(a+1,a+sta[0].second+1,greater<int>());
    for(int i=1;i<=sta[0].second;i++)b[i]=a[i];
    int mi=1,ma=sta[0].second;
    if(m!=1)for(int i=0,sz=sta.size();i<sz;i++){
        if(i==sz-1){
            if(sta[i].first==1) for(int j=1;j<=sta[i].second;j++) a[j]=b[mi++];
            else for(int j=1;j<=sta[i].second;j++) a[j]=b[ma--];
            break;
        }
        int r=sta[i].second,flag=sta[i].first,l=sta[i+1].second;
        for(int j=r;j>l;j--)
            if(flag==1) a[j]=b[ma--];
            else a[j]=b[mi++];
    }
    for(int i=1;i<=n;i++){
        cout<<a[i];
        if(i!=n)cout<<' ';
        else cout<<endl;
    }
}