题目链接:https://www.luogu.com.cn/problem/P7416
分析
上代码
#include<iostream>
#include<cstdio>
#include<algorithm>
#include<vector>
#include<cmath>
#define re register
using namespace std;
vector <pair<int,int> > e[200001];
int n,q,l,r,a[400001],c[200001],ans[200001],st[200001],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()
{
scanf("%d%d",&n,&q);
for(re int i=1;i<=n;i++)
{
scanf("%d",&a[i]);
}
for(re int i=1;i<=q;i++)
{
scanf("%d%d",&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++)
{
printf("%d\n",ans[i]);
}
return 0;
}