#include <bits/stdc++.h>
using namespace std;
#define maxn 100000+10
int T, n, m;
int sum[maxn], ans[maxn];
struct Node
{
int r, l, id, h;
}p[maxn] , q[maxn];
int cmp(Node a, Node b)
{
return a.h < b.h;
}
inline int lowbit(int x)
{
return x & (-x);
}
int get_sum(int x)
{
int s = 0;
while(x > 0)
{
s += sum[x];
x -= lowbit(x);
}
return s;
}
void update(int x)
{
while(x <= n)
{
sum[x]++;
x += lowbit(x);
}
}
int main()
{
cin>>T;
int Kase = 0;
while(T--)
{
memset(sum, 0, sizeof(sum));
cout<<"Case "<<++Kase<<":"<<endl;
cin>>n>>m;
for(int i=0; i<n; i++)
{
cin>>p[i].h;
p[i].id = i+1;
}
for(int i=0; i<m; i++)
{
cin>>q[i].l>>q[i].r>>q[i].h;
q[i].id = i;
}
sort(p, p+n, cmp);
sort(q, q+m, cmp);
for(int i=0 , j=0; i<m; i++)
{
while(j<n && p[j].h <= q[i].h)
{
update(p[j].id);
j++;
}
ans[q[i].id] = get_sum(q[i].r+1) - get_sum(q[i].l);///s[r] - s[l-1];
///离线处理 将(l,r)范围内不大于q[i].h的数处理出来
}
for(int i=0; i<m; i++)
cout<<ans[i]<<endl;
}
return 0;
}
hdu 4417 树状数组 离线处理
最新推荐文章于 2022-08-11 09:49:47 发布