题解
2023-08-25 15:00:37
发布于:广东
2阅读
0回复
0点赞
内存击败两位大佬
#include<bits/stdc++.h>
#define re register
using namespace std;
vector <pair<int,int> > e[200010];
int n,q,l,r,a[400010],c[200010],ans[200010],st[200010],top;
inline int lowbit(int x)
{
return x&(-x);
}
inline void add(int x,int y)
{
for(re int i=x;i<=n;i+=lowbit(i))
{
c[i]+=y;
}
}
inline int query(int x)
{
long long ans=0;
for(re int i=x;i>0;i-=lowbit(i))
{
ans+=c[i];
}
return ans;
}
int main()
{
cin>>n>>q;
for(re int i=1;i<=n;i++)
{
cin>>a[i];
}
for(re int i=1;i<=q;i++)
{
cin>>l>>r;
e[r].push_back((pair<int,int>){l,i});
}
for(re int i=1;i<=n;i++)
{
while(a[st[top]]>a[i]&&top) top--;
if(top&&a[st[top]]==a[i])
{
add(st[top],1);
st[top]=i;
}
else st[++top]=i;
for(re int j=0;j<e[i].size();j++)
{
pair<int,int> t=e[i][j];
ans[t.second]=i-t.first+1-query(i)+query(t.first-1);
}
}
for(re int i=1;i<=q;i++)
{
cout<<ans[i]<<'\n';
}
return 0;
}
这里空空如也
有帮助,赞一个