Advertisement
ChoDog

E: tree

Nov 22nd, 2019
95
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.99 KB | None | 0 0
  1. #include <iostream>
  2. #include <vector>
  3. #include <algorithm>
  4. #include <math.h>
  5.  
  6. using namespace std;
  7.  
  8. vector<int> vec;
  9. int pow2 = 1;
  10.  
  11. int gsd(int a, int b) {
  12.     return (b == 0 ? a : gsd(b, a % b));
  13. }
  14.  
  15. int gcd(int a, int b) {
  16.     return (b == 0 ? a : gcd(b, a % b));
  17. }
  18.  
  19. int f(int l, int r, int lv, int rv, int v) {
  20.  
  21.     if (l <= lv && rv <= r) return vec[v];
  22.     if (lv > r || rv < l) return 0;
  23.     return gcd(f(l, r, lv, lv + (rv - lv) / 2, v * 2 ), f(l, r, lv + (rv - lv) / 2 + 1, rv, v * 2 + 1));
  24.  
  25. }
  26.  
  27. int main() {
  28.     int n, k, news = 0;
  29.     cin >> n >> k;
  30.  
  31.  
  32.  
  33.     while (pow(2, pow2) < n)
  34.         pow2++;
  35.     pow2++;
  36.  
  37.     vec.resize(pow(2, pow2), 0);
  38.  
  39.     for (int i = pow(2, pow2 - 1); i < pow(2, pow2 - 1) + n; i++)
  40.         cin >> vec[i];
  41.  
  42.     for (int i = pow(2, pow2 - 1) - 1; i > 0; i--)
  43.         vec[i] = gsd(vec[2 * i], vec[2 * i + 1]);
  44.  
  45.     for (int i = pow(2, pow2 - 1); i < pow(2, pow2) - k; i++) {
  46.         news = max(news, f(i, i + k - 1, pow(2, pow2 - 1), pow(2, pow2) - 1, 1));
  47.     }
  48.  
  49.     cout << news;
  50.     return 0;
  51. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement