| 比赛 |
26暑假集训模拟赛2 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
丹钓战 |
最终得分 |
100 |
| 用户昵称 |
2_16鸡扒拌面 |
运行时间 |
3.620 s |
| 代码语言 |
C++ |
内存使用 |
11.48 MiB |
| 提交时间 |
2026-07-02 10:19:11 |
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int INF=0x3f3f3f3f;
const int MAXN=500010;
struct tree{
int l,r,id;
bool operator<(const tree&x)const{return r<x.r;}
}Q[MAXN];
int n,q,pos=1;
int a[MAXN],b[MAXN],c[MAXN],ans[MAXN];
stack<int> st;
int lowbit(int x){return x&-x;}
void add(int x,int v){for(int i=x;i<=n;i+=lowbit(i))c[i]+=v;}
int sum(int x)
{
int res=0;
for(int i=x;i;i-=lowbit(i)) res+=c[i];
return res;
}
int main()
{
freopen("stack.in","r",stdin);
freopen("stack.out","w",stdout);
ios::sync_with_stdio(false),cin.tie(nullptr);
cin>>n>>q;
for(int i=1;i<=n;i++) cin>>a[i];
for(int i=1;i<=n;i++) cin>>b[i];
for(int i=1;i<=q;i++)
{
cin>>Q[i].l>>Q[i].r;
Q[i].id=i;
}
sort(Q+1,Q+q+1);
a[0]=b[0]=INF;
st.push(0);
for(int i=1;i<=n;i++)
{
while(1)
{
int j=st.top();
if(a[i]!=a[j]&&b[i]<b[j]) break;
st.pop();
}
add(st.top()+1,1);
add(i+1,-1);
st.push(i);
while(Q[pos].r==i)
{
ans[Q[pos].id]=sum(Q[pos].l);
pos++;
}
}
for(int i=1;i<=q;i++) cout<<ans[i]<<'\n';
return 0;
}