pojStars(线段树)


 1 #include
 2 #include
 3 #include
 4 using namespace std;
 5 const int N = 32000 + 10;
 6 
 7 int ans[N << 2], sum[N << 2], x, y;
 8 
 9 void PushUp(int rt) {
10     sum[rt] = sum[rt << 1] + sum[rt << 1 | 1];
11     return;
12 }
13 
14 void Build(int l, int r, int rt) {
15     //Tree[rt] ++;
16     if (l == r) {
17         sum[rt] = 0;
18         return;
19     }
20     int m = (l + r) >> 1;
21     Build(l, m, rt << 1);
22     Build(m + 1, r, rt << 1 | 1);
23 }
24 void Update(int p, int l, int r, int rt) {
25     //Tree[rt]--;
26     if (l == r) {
27         sum[rt]++;
28         return;
29     }
30     int m = (l + r) >> 1;
31     if (p <= m) Update(p, l, m, rt << 1);
32     else Update(p, m + 1, r, rt << 1 | 1);
33     PushUp(rt);
34 }
35 
36 int Query(int L, int R, int l, int r, int rt) {
37     if (l >= L && r <= R) {
38         return sum[rt];
39     }
40     int m = (l + r) >> 1;
41     int ANS = 0;
42     if (m >= L) ANS += Query(L, R, l, m, rt << 1);
43     if (m < R) ANS += Query(L, R, m + 1, r, rt << 1 | 1);
44     return ANS;
45 }
46 
47 int main() {
48 
49     int n;
50     scanf("%d", &n);
51     //Build(1, 32000, 1);
52     for (int i = 1; i <= n; i++) {
53         scanf("%d %d", &x, &y);
54         int t = Query(0, x, 0, 32000, 1);
55         //cout << t << "eee" << "\n";
56         ans[t]++;
57         Update(x, 0, 32000, 1);
58     }
59     //Build(1, n, 1);a
60     /*for (int i = 1; i <= 7; i++) {
61         cout << sum[i] << "<" << "\n";
62     }*/
63     for (int i = 0; i < n; i++) {
64         printf("%d\n", ans[i]);
65     }
66 
67     return 0;
68 }