Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <vector>
- #include <algorithm>
- #include <math.h>
- using namespace std;
- vector<int> vec;
- int pow2 = 1;
- int gsd(int a, int b) {
- return (b == 0 ? a : gsd(b, a % b));
- }
- int gcd(int a, int b) {
- return (b == 0 ? a : gcd(b, a % b));
- }
- int f(int l, int r, int lv, int rv, int v) {
- if (l <= lv && rv <= r) return vec[v];
- if (lv > r || rv < l) return 0;
- return gcd(f(l, r, lv, lv + (rv - lv) / 2, v * 2 ), f(l, r, lv + (rv - lv) / 2 + 1, rv, v * 2 + 1));
- }
- int main() {
- int n, k, news = 0;
- cin >> n >> k;
- while (pow(2, pow2) < n)
- pow2++;
- pow2++;
- vec.resize(pow(2, pow2), 0);
- for (int i = pow(2, pow2 - 1); i < pow(2, pow2 - 1) + n; i++)
- cin >> vec[i];
- for (int i = pow(2, pow2 - 1) - 1; i > 0; i--)
- vec[i] = gsd(vec[2 * i], vec[2 * i + 1]);
- for (int i = pow(2, pow2 - 1); i < pow(2, pow2) - k; i++) {
- news = max(news, f(i, i + k - 1, pow(2, pow2 - 1), pow(2, pow2) - 1, 1));
- }
- cout << news;
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement