思路:
用一个栈维护,然后取出相等的配对,用树状数组求答案就行
c o d e code code
#include<iostream>
#include<cstdio>
#include<cmath>
#include<queue>
using namespace std;
int n, m, top;
int a[1010000], st[1010100], c[1010100], ans[1010000];
vector<pair<int, int> > q[200100];
int lowbit(int x)
{
return x & (-x);
}
void add(int x)
{
for(; x<=n; x+=lowbit(x))
c[x]++;
}
int query(int x)
{
int ans=0;
for(; x!=0; x-=lowbit(x))
ans+=c[x];
return ans;
}
int main()
{
scanf("%d%d", &n, &m);
for(int i=1; i<=n; i++)
scanf("%d", &a[i]);
for(int i=1; i<=m; i++)
{
int l, r;
scanf("%d%d", &l, &r);
q[r].push_back(make_pair(i, l));
}
for(int i=1; i<=n; i++)
{
while(top&&a[st[top]]>a[i]) top--;
if(top&&a[st[top]]==a[i])
{
add(st[top]);
st[top]=i;
}
else st[++top]=i;
if(q[i].size())
{
for(int j=0; j<q[i].size(); j++)
{
int t1=q[i][j].first, t2=q[i][j].second;
ans[t1]=i-t2+1-(query(i)-query(t2-1));
}
}
}
for(int i=1; i<=m; i++)
printf("%d\n", ans[i]);
return 0;
}