hdu 4417 樹狀陣列 離線處理
阿新 • • 發佈:2019-02-16
#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; }