比赛 26暑假集训模拟赛2 评测结果 AAAAAAAAAAAAAAAAAAAA
题目名称 丹钓战 最终得分 100
用户昵称 运行时间 5.789 s
代码语言 C++ 内存使用 49.58 MiB
提交时间 2026-07-02 09:18:21
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
#define int long long
#define INT_MAX (int)(1e18)
#define pr pair<int,int>

const int N=5e5+10; 

int n,q;
int a[N],b[N];

inline int read(){
    int t=0,f=1;
    register char c=getchar();
    while(c<'0'||c>'9') f=(c=='-')?(-1):(f),c=getchar();
    while(c>='0'&&c<='9') t=(t<<3)+(t<<1)+(c^48),c=getchar();
    return t*f;
}

stack<int> s;

vector<int> g[N];
vector<pr> Q[N];

int ans[N];

struct Tree{
    #define mid (l+r>>1)
    
    int tr[N<<2];
    
    void update(int p,int l,int r,int x){
        if(l==r) return (void)(tr[p]++);
        if(x<=mid) update(p<<1,l,mid,x);
        else update(p<<1|1,mid+1,r,x);
        tr[p]=tr[p<<1]+tr[p<<1|1];
    }
    
    int query(int p,int l,int r,int L,int R){
        if(L<=l&&R>=r) return tr[p];
        int res=0;
        if(L<=mid) res+=query(p<<1,l,mid,L,R);
        if(R>mid) res+=query(p<<1|1,mid+1,r,L,R);
        return res;
    }

    #undef mid
}Tr;

signed main(){
    freopen("stack.in","r",stdin);
    freopen("stack.out","w",stdout);
    n=read(),q=read();
    for(int i=1;i<=n;i++) a[i]=read();
    for(int i=1;i<=n;i++) b[i]=read();
    b[0]=INT_MAX;s.push(0); 
    for(int i=1;i<=n;i++){
        while(!(a[s.top()]!=a[i]&&b[s.top()]>b[i])) s.pop();
        g[s.top()].push_back(i),s.push(i);
    }
    for(int i=1;i<=q;i++){
        int l=read(),r=read();
        Q[l].push_back({r,i});
    }
    for(int i=0;i<=n;i++){
        for(pr j:Q[i]) ans[j.second]=Tr.query(1,1,n,i,j.first);
        for(int j:g[i]) Tr.update(1,1,n,j);
    }
    for(int i=1;i<=q;i++) cout<<ans[i]<<"\n";
    return 0;
}