| 比赛 |
26暑假集训模拟赛2 |
评测结果 |
AAAAAAAAAAAAAAAAAAAA |
| 题目名称 |
丹钓战 |
最终得分 |
100 |
| 用户昵称 |
PXCZM |
运行时间 |
6.717 s |
| 代码语言 |
C++ |
内存使用 |
62.81 MiB |
| 提交时间 |
2026-07-02 09:57:36 |
显示代码纯文本
#include <bits/stdc++.h>
using namespace std;
int read()
{
int res=0,c=getchar();
for(;!isdigit(c);c=getchar());
for(;isdigit(c);c=getchar()) res=res*10+(c^48);
return res;
}
int n,m;
int val1[500010],val2[500010];
struct state
{
int a,b,idx;
state(int _a,int _b,int _idx) : a(_a),b(_b),idx(_idx){}
state(){}
};
stack<state>st;
int root[500010];
int sum[10000050],ls[10000050],rs[10000050],cnt;
void insert(int last,int now,int l,int r,int pos,int v)
{
sum[now]=sum[last]+v;
if(l==r) return;
ls[now]=ls[last]; rs[now]=rs[last];
int mid=(l+r)>>1;
if(pos<=mid)
{
ls[now]=++cnt;
insert(ls[last],ls[now],l,mid,pos,v);
}
else
{
rs[now]=++cnt;
insert(rs[last],rs[now],mid+1,r,pos,v);
}
}
int query(int rt1,int rt2,int l,int r,int pl,int pr)
{
if(l>=pl&&r<=pr) return sum[rt2]-sum[rt1];
int mid=(l+r)>>1;
if(pl<=mid)
{
if(pr>mid) return query(ls[rt1],ls[rt2],l,mid,pl,pr)+query(rs[rt1],rs[rt2],mid+1,r,pl,pr);
else return query(ls[rt1],ls[rt2],l,mid,pl,pr);
}
else return query(rs[rt1],rs[rt2],mid+1,r,pl,pr);
}
int main()
{
freopen("stack.in","r",stdin);
freopen("stack.out","w",stdout);
n=read(); m=read();
for(int i=1;i<=n;i++) val1[i]=read();
for(int i=1;i<=n;i++) val2[i]=read();
for(int i=1;i<=n;i++)
{
while(st.size()&&(st.top().a==val1[i]||st.top().b<=val2[i])) st.pop();
root[i]=++cnt;
insert(root[i-1],root[i],1,n+1,(st.size()?st.top().idx:n+1),1);
st.emplace(val1[i],val2[i],i);
}
while(m--)
{
int l,r;
l=read(); r=read();
printf("%d\n",r-l+1-query(root[l-1],root[r],1,n+1,l,r));
}
return 0;
}