KiK0S

Untitled

Mar 20th, 2019
147
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.15 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <map>
  4. #include <set>
  5. #include <queue>
  6. #include <algorithm>
  7. #include <string>
  8. #include <cmath>
  9. #include <cstdio>
  10. #include <iomanip>
  11. #include <fstream>
  12. #include <cassert>
  13. #include <cstring>
  14. #include <unordered_set>
  15. #include <unordered_map>
  16. #include <numeric>
  17. #include <ctime>
  18. #include <bitset>
  19. #include <complex>
  20. #include <random>
  21. using namespace std;
  22.  
  23. typedef long long ll;
  24. typedef unsigned long long ull;
  25.  
  26. #ifdef DEBUG
  27.     const int MAXN = 10;
  28.     const int MAXLOG = 4;
  29.     const int MAXSQRT = 4;
  30. #else
  31.     const int MAXN = 3e5;
  32.     const int MAXLOG = 20;
  33.     const int MAXSQRT = 400;
  34.     #define cerr if (false) cerr
  35. #endif
  36.  
  37. mt19937 rng(time(0));
  38.  
  39. const int INF = 1e9;
  40. const int MOD = 1e9 + 7;
  41.  
  42. int n;
  43. int ans = 0;
  44.  
  45. int val[MAXN];
  46. int sparse[MAXN][MAXLOG];
  47. int precalc[MAXN];
  48. int border[MAXN][MAXLOG];
  49. int color[MAXN][MAXLOG];
  50.  
  51. void build() {
  52.     for (int i = 0; i < n; i++) {
  53.         sparse[i][0] = val[i];
  54.     }
  55.     for (int i = 1; i < MAXLOG; i++) {
  56.         for (int j = 0; (j + (1 << i)) <= MAXLOG; j++) {
  57.             sparse[j][i] = min(sparse[j][i - 1], sparse[j + (1 << (i - 1))][i - 1]);
  58.         }
  59.     }
  60. }
  61.  
  62. int get(int l, int r) {
  63.     int lg = precalc[r - l + 1];
  64.     return min(sparse[l][lg], sparse[r - (1 << lg) + 1][lg]);
  65. }
  66.  
  67. int nxt(int x, int pos) {
  68.     int l = pos + 1;
  69.     int r = n;
  70.     while (l + 1 < r) {
  71.         int mid = (l + r) >> 1;
  72.         if (get(pos + 1, mid) <= x) {
  73.             r = mid;
  74.         }
  75.         else {
  76.             l = mid;
  77.         }
  78.     }
  79.     return r;
  80. }
  81.  
  82. inline void init() {
  83.     precalc[1] = 0;
  84.     for (int i = 2; i < MAXN; i++) {
  85.         precalc[i] = precalc[i >> 1] + 1;
  86.     }
  87.     ans = 0;
  88. }
  89.  
  90. inline void solve() {
  91.     init();
  92.     for (int i = 0; i < n; i++) {
  93.         cin >> a[i];
  94.     }
  95.     build();
  96.     for (int i = 0; i < n; i++) {
  97.         int pnt = 1;
  98.         int cur = val[i];
  99.         int pos = i;
  100.         while (pos < n) {
  101.             pos = nxt(cur, pos);
  102.             color[i][pnt] = cur;
  103.             border[i][pnt++] = pos - 1;
  104.             if (pos != n) {
  105.                 cur = cur % val[pos];
  106.             }
  107.         }
  108.     }
  109. }
  110.  
  111. signed main() {
  112.     #ifdef DEBUG
  113.         freopen("I.in", "r", stdin);
  114.         freopen("I.out", "w", stdout);
  115.     #else
  116.    
  117.     #endif
  118.     ios_base::sync_with_stdio(0);
  119.     cin.tie(0);
  120.     cout.tie(0);
  121.     while (cin >> n)
  122.         solve();
  123.     return 0;
  124. }
Advertisement
Add Comment
Please, Sign In to add comment