Advertisement
Guest User

kin

a guest
Nov 17th, 2019
119
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.12 KB | None | 0 0
  1. #include <iostream>
  2. #include <cstdlib>
  3. #include <iomanip>
  4.  
  5. using std::cin;
  6. using std::cout;
  7.  
  8. int get_right(int n) { return (n + 1) * 2; }
  9. int get_parent(int n) { return (n - 1) / 2; }
  10.  
  11. uint64_t insert_rank(uint64_t *t, int n, int i, uint64_t inc)
  12. {
  13.     int id = i + n - 2;
  14.  
  15.     uint64_t r = 0;
  16.  
  17.     while(id != 0)
  18.     {
  19.         t[id] = (t[id] + inc) % 1000000000;
  20.  
  21.         int parent = get_parent(id);
  22.  
  23.         if(id % 2 == 1)
  24.             r += t[get_right(parent)];
  25.  
  26.         id = parent;
  27.     }
  28.  
  29.     return r;
  30. }
  31.  
  32. int main()
  33. {
  34.     int n, k;
  35.     cin >> n >> k;
  36.  
  37.     int size = 1;
  38.     while(size < n)
  39.         size = size << 1;
  40.  
  41.     int t[n];
  42.     uint64_t itree[2 * size - 1];
  43.     uint64_t inv[n][k];
  44.    
  45.     for(int i = 0; i < n; i++)
  46.     {
  47.         for(int j = 1; j < k; j++)
  48.         {
  49.             inv[i][j] = 0;
  50.         }
  51.         inv[i][0] = 1;
  52.     }
  53.    
  54.     for(int i = 0; i < n; i++)
  55.     {
  56.         cin >> t[i];
  57.     }
  58.  
  59.     for(int len = 1; len < k; len++)
  60.     {
  61.         for(int i = 0; i < 2 * size - 1; i++)
  62.             itree[i] = 0;
  63.  
  64.         for(int i = 0; i < n; i++)
  65.         {
  66.             inv[i][len] = insert_rank(itree, size, t[i], inv[i][len - 1]);
  67.         }
  68.     }
  69.  
  70.     uint64_t r = 0;
  71.     for(int i = 0; i < n; i++)
  72.         r = (r + inv[i][k-1]) % 1000000000;
  73.  
  74.     cout << r;
  75. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement