Advertisement
Guest User

Untitled

a guest
Oct 23rd, 2019
83
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.70 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <vector>
  4. #include <unordered_map>
  5.  
  6. template<typename T>
  7. class SegmentTree {
  8.  private:
  9.   int CAPACITY_;
  10.   T* array_;
  11.   T (* merge_function_)(T, T);
  12.   T default_value_;
  13.  
  14.  public:
  15.   SegmentTree(int capacity, T* array, T (* merge_function)(T, T), T default_value)
  16.       : merge_function_(merge_function), default_value_(default_value) {
  17.       CAPACITY_ = 1;
  18.       while (CAPACITY_ < capacity) {
  19.           CAPACITY_ <<= 1;
  20.       }
  21.       initialize();
  22.       for (size_t i = 0; i < capacity; ++i) {
  23.           array_[CAPACITY_ + i] = array[i];
  24.       }
  25.       build();
  26.   }
  27.  
  28.   T query(int l, int r) {
  29.       return query_(std::max(0, l), std::min(r, CAPACITY_ - 1), 0, CAPACITY_ - 1, 1);
  30.   }
  31.  
  32.   void update(int i, T value) {
  33.       if (i >= CAPACITY_) {
  34.           return;
  35.       }
  36.       array_[CAPACITY_ + i] = value;
  37.       update_(CAPACITY_ + i);
  38.   }
  39.  private:
  40.   void initialize() {
  41.       array_ = new T[2 * CAPACITY_];
  42.       for (int i = 2 * CAPACITY_ - 1; i >= 0; --i) {
  43.           array_[i] = default_value_;
  44.       }
  45.   }
  46.  
  47.   void build() {
  48.       for (int i = CAPACITY_ - 1; i > 0; --i) {
  49.           array_[i] = merge_function_(array_[2 * i], array_[2 * i + 1]);
  50.       }
  51.   }
  52.  
  53.   T query_(int l, int r, int left, int right, int vertex) {
  54.       if (r < l) {
  55.           return default_value_;
  56.       }
  57.       if (l == left && r == right) {
  58.           return array_[vertex];
  59.       }
  60.       int middle = (left + right) >> 1;
  61.       return merge_function_(
  62.           query_(l, std::min(middle, r), left, middle, vertex * 2),
  63.           query_(std::max(l, middle + 1), r, middle + 1, right, vertex * 2 + 1)
  64.       );
  65.   }
  66.  
  67.   void update_(int i) {
  68.       while (i > 1) {
  69.           i >>= 1;
  70.           array_[i] = merge_function_(array_[2 * i], array_[2 * i + 1]);
  71.       }
  72.   }
  73. };
  74.  
  75. long long merge_sum(long long a, long long b) {
  76.     return a + b;
  77. }
  78.  
  79. int main() {
  80.     std::ios_base::sync_with_stdio(false);
  81.     std::cin.tie(nullptr);
  82.  
  83.     std::freopen("input.txt", "r", stdin);
  84.     std::freopen("output.txt", "w", stdout);
  85.  
  86.     int n;
  87.     std::cin >> n;
  88.     std::vector<std::pair<int, int>> stars(n);
  89.     std::unordered_map<int, int> index_of_first_level_star;
  90.     int max_x = -1;
  91.     for (int i = 0; i < n; ++i) {
  92.         std::cin >> stars[i].first >> stars[i].second;
  93.         if (index_of_first_level_star.count(stars[i].second) == 0) {
  94.             index_of_first_level_star[stars[i].second] = i;
  95.         }
  96.         max_x = std::max(stars[i].first, max_x);
  97.     }
  98.  
  99.     std::vector<long long> count(max_x + 1, 0);
  100.     SegmentTree<long long> tree(count.size(), count.data(), &merge_sum, 0);
  101.  
  102.     std::unordered_map<long long, int> answer;
  103.     std::vector<long long> answer_for_star(stars.size());
  104.     answer[0] = 1;
  105.     answer_for_star[0] = 0;
  106.     tree.update(stars[0].first, 1);
  107.  
  108.     for (int i = 1; i < stars.size(); ++i) {
  109.         if (stars[i].second == stars[i - 1].second) {
  110.             answer_for_star[i] = answer_for_star[i - 1] + 1 + tree.query(stars[i - 1].first + 1, stars[i].first);
  111.  
  112.         } else if (stars[i].first == stars[i - 1].first) {
  113.             answer_for_star[i] = answer_for_star[i - 1] + 1;
  114.         } else if (stars[i].first < stars[i - 1].first) {
  115.             answer_for_star[i] = answer_for_star[i - 1] + 1 - tree.query(stars[i].first + 1, stars[i - 1].first);
  116.         } else {
  117.             answer_for_star[i] = answer_for_star[i - 1] + 1 + tree.query(stars[i - 1].first + 1, stars[i].first);
  118.         }
  119.         answer[answer_for_star[i]]++;
  120.         tree.update(stars[i].first, tree.query(stars[i].first, stars[i].first) + 1);
  121.     }
  122.  
  123.     for (int i = 0; i < n; ++i) {
  124.         std::cout << answer[i] << "\n";
  125.     }
  126.     return 0;
  127. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement