这道题的含义就是在两个数组中,区间相同时最小的元素的位置是相同的,我们这道题用单调递增栈做,保证在栈中元素是单调递增的,
用一个整型变量k来记录,k的初始值是1(因为第一个元素是提前入栈的,当栈中只有一个元素时,k为1),最后输出k,当栈中的元素个数
是相同的时候,k就加一,当不相同的时候就输出k值。
因为题目的要求时输出的是两个数组中从a1,b1开始到ap,bp,这时最小元素的索引不相同。然后输出的时p值
而单调栈就可以从小到大存储,然后当进入的数比栈顶元素大时,就直接入栈;当进入的数比栈顶元素小时,栈顶元素出栈,一直到比栈顶
元素大,就进栈,这样的话,该区间的最小的元素都被存储起来,而那些数值较大的元素就不管。

#include<iostream> 
#include<stack>
using namespace std;
int main(){
    int n;
    while(~scanf("%d",&n)){
        int a[100005],b[100005];
        stack<int>A,B;
        for(int i=0;i<n;i++)
            scanf("%d",&a[i]);
        for(int i=0;i<n;i++)
            scanf("%d",&b[i]);
            A.push(a[0]);
            B.push(b[0]); 
            int k=1;
        while(1){
           if(k==n){
               printf("%d\n",n);
               break;
           } 
                while(1){
                    if(!A.empty()){
                        if(a[k]<A.top())
                            A.pop();
                        else{
                                A.push(a[k]);
                                break;
                        }
                    
                    }
                    else{
                        A.push(a[k]);
                        break;
                    }
                }
                    while(1){
                    if(!B.empty()){
                        if(b[k]<B.top())
                            B.pop();
                        else{
                                B.push(b[k]);
                                break;
                        }
                    
                    }
                    else{
                        B.push(b[k]);
                        break;
                    }
                }
            if(A.size()==B.size())//栈中进一个元素就比较一次,更新k值
                    k++;
            else{
                    printf("%d\n",k);
                    break;
            }
        }
    }
    return 0;
}