AlexNeagu11

Untitled

Feb 10th, 2022
133
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 1.90 KB | None | 0 0
  1.  
  2. #include<bits/stdc++.h>
  3. #define int long long
  4. #pragma GCC target ("avx2")
  5. #pragma GCC optimization ("O3")
  6. #pragma GCC optimization ("unroll-loops")
  7. #define pb push_back
  8. #define mp make_pair
  9. using namespace std;
  10. typedef long long ll;
  11. typedef long double ld;
  12. typedef pair<ll,ll> pi;
  13. const int mod = 1e9 + 9;
  14. const int N = 106 * 106;
  15. const int nax = 1e6+6;
  16. mt19937 rng(chrono::steady_clock::now().time_since_epoch().count());
  17. ifstream in("rmq.in");
  18. ofstream out("rmq.out");
  19.  
  20. int logaritm[100006];
  21.  
  22. int32_t main() {
  23.  
  24. ios_base::sync_with_stdio(false);
  25. cin.tie(0);
  26.  
  27. //
  28. logaritm[1] = 0;
  29. for(int i = 2; i < 100006; i++) {
  30. logaritm[i] = logaritm[i / 2] + 1;
  31. }
  32.  
  33.  
  34. int n, m;
  35. in >> n >> m;
  36.  
  37. // n -> elemente
  38. // m -> queryuri
  39.  
  40. int a[n + 1];
  41. for(int i = 1; i <= n; i++) in >> a[i];
  42.  
  43. int mn[n + 1][30];
  44.  
  45. // (1 << n) = 2 ^ n
  46.  
  47. for(int i = 1; i <= n; i++) {
  48. mn[i][0] = a[i];
  49. // mn[i][0] --> i..i
  50. }
  51.  
  52. // 2 ^ len --> lungimea intervalelor curente
  53. for(int len = 1; (1 << len) <= n; len++) {
  54. // acum precalculez raspunsurile pentru intervalele de lungime 2 ^ len
  55. // 2 ^ len elemente incepand cu i
  56. // i .. i + (2 ^ len) - 1
  57.  
  58. for(int i = 1; i + (1 << len) - 1 <= n; i++) {
  59. mn[i][len] = min(mn[i][len - 1], mn[i + (1 << (len - 1))][len - 1]);
  60. }
  61. }
  62.  
  63.  
  64. for(int i = 1; i <= m; i++) {
  65. int l, r;
  66. in >> l >> r;
  67. int k = logaritm[r - l + 1];
  68. out << min(mn[l][k], mn[r - (1 << k) + 1][k]) << '\n';
  69. // sa impart intervalul l..r in doua intervale de lungime 2^k unde k un numar
  70. // k = log(r - l + 1) --> r-l+1 lungimea
  71. // 2^k lungimile intervalelor cu care voi imparti intervalul mare
  72. // min(mn[l][k], mn[r - 2^k + 1][k]) --> raspunsul la query
  73.  
  74. }
  75.  
  76. return 0;
  77. }
Advertisement
Add Comment
Please, Sign In to add comment