1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71
| #include<bits/stdc++.h> #define technopolis2085 return 0 using namespace std; const int N = 2e5+10; const int M = 80*N; struct node{ int l, r, val; }tr[M]; struct Plank{ int l, r, k; }plank[N]; int n, m;
int rt[N]; int idx; void insert(int x, int &y, int l, int r, int w){ y = ++idx; tr[y] = tr[x]; tr[y].val ++; if(l==r) return ; int mid = l+r>>1; if(w<=mid) insert(tr[x].l, tr[y].l, l, mid, w); else insert(tr[x].r, tr[y].r, mid+1, r, w); }
int query(int x, int y, int l, int r, int k){ if(l==r) return l; int mid = l+r>>1; int q = tr[tr[y].l].val - tr[tr[x].l].val; if(q>=k) return query(tr[x].l, tr[y].l, l, mid, k); else return query(tr[x].r, tr[y].r, mid+1, r, k-q); } vector<int> times[N];
int ans[N]; int main(){ ios::sync_with_stdio(0); cin.tie(0), cout.tie(0); cin>>n>>m; for(int i=1;i<=n;i++){ cin>>plank[i].l>>plank[i].r>>plank[i].k; } int bulletpos; for(int i=1;i<=m;i++){ cin>>bulletpos; times[bulletpos].push_back(i); } int maxn = 2e5+2; for(int i=1;i<=maxn;i++){ if(times[i].size() == 0) times[i].push_back(m+1); } for(int i=1;i<=maxn;i++){ rt[i] = rt[i-1]; for(int j=0;j<times[i].size();j++){ insert(rt[i], rt[i], 1, m+1, times[i][j]); } } for(int i=1;i<=n;i++){ int res = query(rt[plank[i].l - 1], rt[plank[i].r], 1, m+1, plank[i].k); if(res == m+1) continue; ans[res] ++; } for(int i=1;i<=m;i++){ cout<<ans[i]<<'\n'; }
technopolis2085; }
|