template<classT, constint N> classBIT { public : T c[N]; int size; inlineintlowbit(int x){ return x&(-x); } inlinevoidinit(int sz){ size = sz; for(int i = 1; i <= sz; i++) c[i] = 0; } inlinevoidmodify(int x, T v){ assert(x != 0); for(int i = x; i <= size; i += lowbit(i)) c[i] += v; } inline T query(int x){ assert(x <= size); T ans = 0; for(int i = x; i; i -= lowbit(i)) ans += c[i]; return ans; } };
constint N = 1e5 + 10; constint M = 2e5 + 10;
int n, K; structNode { int x, y, z, ans; inlinebooloperator == (const Node & b) const { return x == b.x && y == b.y && z == b.z; } inlinebooloperator < (const Node & b) const { if(x != b.x) return x < b.x; if(y != b.y) return y < b.y; return z < b.z; } }a[N]; map<Node , int >cnt;
inlinevoidInput(){ read(n, K); for(int i = 1; i <= n; i++) { read(a[i].x, a[i].y, a[i].z); cnt[a[i]]++; } }
BIT<int , M >c; Node tmp[N];
inlinevoidCDQ(int l, int r){ if(l == r) return ; int mid = l + r >> 1; CDQ(l, mid), CDQ(mid + 1, r); int i = l, j = mid + 1, k = l; while(i <= mid || j <= r) { if(j > r || (i <= mid && make_pair(a[i].y, a[i].z) <= make_pair(a[j].y, a[j].z))) { c.modify(a[i].z, cnt[a[i]]); tmp[k++] = a[i++]; } else { a[j].ans += c.query(a[j].z); tmp[k++] = a[j++]; } } for(int i = l; i <= mid; i++) c.modify(a[i].z, -cnt[a[i]]); for(int i = l; i <= r; i++) a[i] = tmp[i]; }
int tot[N];
inlinevoidWork(){ c.init(K); sort(a + 1, a + n + 1); int t = unique(a + 1, a + n + 1) - a - 1; CDQ(1, t); for(int i = 1; i <= t; i++) { tot[a[i].ans + cnt[a[i]] - 1] += cnt[a[i]]; } for(int i = 0; i < n; i++) { printf("%d\n", tot[i]); } }
intmain(){ int T = 1; while(T--) { Input(); Work(); } return0; }
namespace FastIO { template<typename T> inlinevoidread(T &x){ x = 0; int f = 1; char ch = getchar(); while (!isdigit(ch)) { if (ch == '-') f = -1; ch = getchar(); } while (isdigit(ch)) { x = x * 10 + (ch ^ 48); ch = getchar(); } x *= f; return; } template<typename T, typename... Args> inlinevoidread(T &x, Args &...args){ read(x); read(args...); } }; usingnamespace FastIO;
template<classT, constint S> structBIT { T c[S]; int size; inlineintlowbit(int x){ return x & (-x); } voidinit(int sz){ size = sz; memset(c, 0, sizeof(c)); } voidmodify(int x, T v){ for (; x <= size; x += lowbit(x)) c[x] += v; } T query(int x){ T res = 0; for (; x; x -= lowbit(x)) res += c[x]; return res; } };
int n, m; structNode { int z, x, y; Node() {} Node(int t, int x_, int y_) : z(t), x(x_), y(y_) {} inlinebooloperator < (const Node &b) const { return x == b.x ? y < b.y : x < b.x; } } A[N], tmp[N]; int pos[N]; ll Ans[N];
BIT<int, N> c;
inlinevoidInput(){ read(n, m); c.init(n); for (int i = 1, x; i <= n; ++i) { read(x); pos[x] = i; A[i] = Node(0, i, x); } int tim = n; for (int i = 1, x; i <= m; ++i) { read(x); A[pos[x]].z = tim--; } for (int i = 1; i <= n; ++i) { if (!A[i].z) A[i].z = tim--; } }
voidCDQ(int l, int r){ if(l == r) return; int mid = (l + r) >> 1; CDQ(l, mid); CDQ(mid + 1, r); int i = l, j = mid + 1, k = l; while(i <= mid || j <= r) { if(j > r || (i <= mid && A[i] < A[j])) { c.modify(A[i].y, 1); tmp[k++] = A[i++]; } else { Ans[A[j].z] += c.query(c.size) - c.query(A[j].y); tmp[k++] = A[j++]; } } for(int i = l; i <= mid; i++) c.modify(A[i].y, -1); for(int i = l; i <= r; i++) A[i] = tmp[i]; for(int i = r; i >= l; i--) { if(A[i].z <= mid) { c.modify(A[i].y, 1); } else { Ans[A[i].z] += c.query(A[i].y); } } for(int i = l; i <= r; i++) { if(A[i].z <= mid) { c.modify(A[i].y, -1); } } }
inlinevoidWork(){ sort(A + 1, A + n + 1, [](Node &a, Node &b) { return a.z < b.z; }); CDQ(1, n); for(int i = 1; i <= n; i++) { Ans[i] += Ans[i - 1]; } for(int i = n; i >= n - m + 1; i--) { printf("%lld\n", Ans[i]); } }
intmain(){ int T = 1; while(T--) { Input(); Work(); } return0; }