1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70
| #include <iostream> #include<vector>
using namespace std;
vector<int> tree; vector<int> arr;
int gcd(int x, int y) { if (x == 0) { return y; } return gcd(y % x, x); }
int lcm(int x, int y) { return x / gcd(x, y) * y; }
int query(int root, int larr, int rarr, int lquery, int rquery) { if (lquery > rarr || rquery < larr) { return 1; } if (lquery <= larr && rarr <= rquery) { return tree[root]; } int mid = larr + ((rarr - larr) >> 1); int l = query(2 * ]]]] ]]] root, larr, mid, lquery, rquery); int r = query(2 * root + 1, mid + 1, rarr, lquery, rquery); return lcm(l, r); }
void build(int root, int larr, int rarr) { if (larr == rarr) { tree[root] = arr[larr]; return; } int mid = larr + ((rarr - larr) >> 1); build(root * 2, larr, mid); build(root * 2 + 1, mid + 1, rarr);
tree[root] = lcm(tree[root * 2], tree[root * 2 + 1]); }
int main() { arr = {5, 7, 5, 2, 10, 12, 11, 17, 14, 1, 44}; vector<vector<int>> queries = {{2, 5}, {5, 10}, {0, 10}}; tree.resize(1000, 0);
build(1, 0, arr.size() - 1); for (auto q: queries) { cout << query(1, 0, arr.size() - 1, q[0], q[1]) << endl; } return 0; }
|