Advertisement
Guest User

Untitled

a guest
Sep 15th, 2019
140
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.14 KB | None | 0 0
  1. #include <iostream>
  2. #include <algorithm>
  3. #include <numeric>
  4. #include <vector>
  5. #include <map>
  6.  
  7. #define F first
  8. #define S second
  9.  
  10. using namespace std;
  11. using vi = vector<int>;
  12. using pi = pair<int, int>;
  13. using vpi = vector<pi>;
  14.  
  15. const int N = 1e5;
  16.  
  17. int gcd(int a, int b) {
  18. while(b != 0) swap(a %= b, b);
  19. return a;
  20. }
  21.  
  22. int main() {
  23. ios_base::sync_with_stdio(0); cin.tie(0);
  24. int n, m=2; cin >> n;
  25. while((m*m)*(m*m) <= n) ++m; --m;
  26. vi v[5]; v[0] = vi(n);
  27. for(int i = 0; i < n; ++i) cin >> v[0][i];
  28. for(int i = 1; i < 5; ++i) {
  29. v[i] = vi(1+v[i-1].size() / m);
  30. for(int j = 0, k = -1; j < v[i-1].size(); ++j) {
  31. if(j-m == k*m) v[i][++k] = v[i-1][j];
  32. else v[i][k] = gcd(v[i][k], v[i-1][j]);
  33. }
  34. }
  35.  
  36. int q; cin >> q;
  37. while (q--) {
  38. int l, r; cin >> l >> r; --l;
  39. int a = 0, t = 1, j = 0;
  40. for(; j < 4; t *= m, ++j)
  41. for(int dm = t*m; l+t <= r && l % dm; l += t) a = gcd(a, v[j][l/t]);
  42. for(++j; j--; t /= m)
  43. for(; l+t <= r; l += t) a = gcd(a, v[j][l/t]);
  44. cout << a << ' ';
  45. }
  46.  
  47. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement