扫描线学习笔记·持续更新
P10814 【模板】离线二维数点 - 洛谷
solve:
枚举 a[i]
过程中将其加入树状数组 f[i]
维护小于等于 i
的数的个数,然后我们可以用前缀和的思路解决询问。
code:
#include<bits/stdc++.h>
using namespace std;
constexpr int mod=998244353,N=2e6+10;
#define pii pair<int,int>
#define piii pair<pii,int>
#define fi first
#define se second
int n,m,a[N],f[N],ans[N];
vector<piii>g[N];
int lb(int x){return (-x)&x;}
void add(int k){for(;k<=n;k+=lb(k)) f[k]++;
}
int q(int k){int tmp=0;for(;k>=1;k-=lb(k)) tmp+=f[k];return tmp;
}
void init(){cin>>n>>m;for(int i=1;i<=n;++i)cin>>a[i];for(int i=1;i<=m;++i){int l,r,x;cin>>l>>r>>x;g[l-1].push_back({{x,-1},i});g[r].push_back({{x,1},i});}
}
void solve(){for(int i=1;i<=n;++i){add(a[i]);for(auto v:g[i]) ans[v.se]+=v.fi.se*q(v.fi.fi);}for(int i=1;i<=m;++i)cout<<ans[i]<<"\n";
}
int main(){ios::sync_with_stdio(0),cin.tie(0);init();solve();return 0;
}