-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathCDQ.cpp
More file actions
92 lines (82 loc) · 1.64 KB
/
Copy pathCDQ.cpp
File metadata and controls
92 lines (82 loc) · 1.64 KB
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
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
#include<bits/stdc++.h>
using namespace std;
const int N=100010,M=N*2;
int n,m;
struct Data{
int a,b,c,s,res;
bool operator < (const Data& da) const{
if(a!=da.a)return a<da.a;
else if(b!=da.b)return b<da.b;
else return c<da.c;
}
bool operator == (const Data& da) const{
return a==da.a&&b==da.b&&c==da.c;
}
}d[N],w[N];
int tr[M],ans[M];
int lowbit(int x){
return x&-x;
}
void add(int x,int val){
for(int i=x;i<M;i+=lowbit(i)){
tr[i]+=val;
}
}
int query(int x){
int res=0;
for(int i=x;i;i-=lowbit(i)){
res+=tr[i];
}
return res;
}
void msort(int l,int r){
if(l>=r)return;
int mid=l+(r-l)/2;
msort(l,mid),msort(mid+1,r);
int i=l,j=mid+1,k=0;
while(i<=mid&&j<=r){
if(d[i].b<=d[j].b){
add(d[i].c,d[i].s);
w[k++]=d[i++];
}
else {
d[j].res+=query(d[j].c);
w[k++]=d[j++];
}
}
while(i<=mid){
add(d[i].c,d[i].s);
w[k++]=d[i++];
}
while(j<=r){
d[j].res+=query(d[j].c);
w[k++]=d[j++];
}
for(int i=l;i<=mid;i++){
add(d[i].c,-d[i].s);
}
for(int i=l,j=0;j<k;i++,j++){
d[i]=w[j];
}
}
int main(){
scanf("%d%d",&n,&m);
for(int i=0;i<n;i++){
int a,b,c;
scanf("%d%d%d",&a,&b,&c);
d[i]={a,b,c,1};
}
sort(d,d+n);
int k=1;
for(int i=1;i<n;i++){
if(d[i]==d[k-1])d[k-1].s++;
else d[k++]=d[i];
}
msort(0,k-1);
for(int i=0;i<k;i++){
ans[d[i].res+d[i].s-1]+=d[i].s;
}
for(int i=0;i<n;i++){
printf("%d\n",ans[i]);
}
}