Advertisement
Guest User

Untitled

a guest
May 22nd, 2018
82
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 3.88 KB | None | 0 0
  1. Даша, SQRT1, C
  2. #define _CRT_SECURE_NO_WARNINGS
  3. #pragma comment(linker, "/STACK:66777216")
  4. #include <iostream>
  5. #include <iomanip>
  6. #include <algorithm>
  7. #include <cmath>
  8. #include <vector>
  9. #include <string>
  10. #include <map>
  11. #include <set>
  12. #include <queue>
  13. #include <bitset>
  14. #include <list>
  15. #define endl "\n"
  16. using namespace std;
  17. typedef long long ll;
  18. typedef unsigned long long ull;
  19. typedef pair <ll, ll> pii;
  20. typedef pair <ll, ll> pil;
  21. typedef pair <ll, ll> pll;
  22. typedef vector <ll> vi;
  23. typedef vector <ll> vll;
  24. typedef vector <string> vstr;
  25. typedef vector < vector <ll> > vvi;
  26. typedef vector < vector <ll> > vvll;
  27. ll inf = 1e9 + 7;
  28. ll INF = 1e18;
  29. ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
  30.  
  31. struct block {
  32. ll n;
  33. ll r;
  34. vector <ll> v;
  35. ll m;
  36. block() {
  37. r = 0;
  38. }
  39. };
  40.  
  41. struct SQRT {
  42. list<block> b;
  43. vector <ll> a;
  44. ll k, n, m;
  45. SQRT(vector <ll> &a) {
  46. this->a = a;
  47. build();
  48. }
  49. void build() {
  50. n = a.size();
  51. k = sqrt(n + 0.5);
  52. m = (n + k - 1) / k;
  53. b.resize(m);
  54. int i = 0;
  55. for (list<block>::iterator it = b.begin(); it != b.end() && i < m; it++, i++) {
  56. (*it).m = INF;
  57. (*it).n = min(k, n - i * k);
  58. (*it).r = 0;
  59. (*it).v.resize((*it).n);
  60. int cnt = 0;
  61. for (ll j = i * k; j < i * k + k && j < n; j++, cnt++) {
  62. (*it).v[cnt] = (a[j]);
  63. (*it).m = min(a[j], (*it).m);
  64. }
  65. }
  66. }
  67. void rebuild() {
  68. list<block>::iterator it = b.begin();
  69. int j = 0;
  70. while (it != b.end()) {
  71. if ((*it).r)
  72. for (ll i = (*it).n - 1; i >= 0; i--)
  73. a[j] = (*it).v[i], j++;
  74. else
  75. for (ll i = 0; i < (*it).n; i++)
  76. a[j] = (*it).v[i], j++;
  77. it++;
  78. }
  79. b.clear();
  80. build();
  81. }
  82. list<block>::iterator find_block(ll j) {
  83. ll count = 0;
  84. list<block>::iterator it = b.begin();
  85. while (count + (*it).n <= j) {
  86. count += (*it).n;
  87. it++;
  88. }
  89. return it;
  90. }
  91. pair<list<block>::iterator, ll> find_place(ll j) {
  92. ll count = 0;
  93. list<block>::iterator it = b.begin();
  94. while (count + (*it).n <= j) {
  95. count += (*it).n;
  96. it++;
  97. }
  98. return make_pair(it, j - count);
  99. }
  100. list<block>::iterator splitik(int j) {
  101. if (j < 0) return b.begin();
  102. pair<list<block>::iterator, ll> temp = find_place(j);
  103. list<block>::iterator it = temp.first;
  104. ll place = temp.second;
  105. if ((*it).r) {
  106. reverse((*it).v.begin(), (*it).v.end());
  107. (*it).r = 0;
  108. }
  109. if (place + 1 == (*it).n) {
  110. it++;
  111. return it;
  112. }
  113. block one, two;
  114. one.n = place + 1;
  115. one.v.resize(one.n);
  116. one.m = INF;
  117. int cnt = 0;
  118. for (ll i = 0; i <= place; i++) {
  119. one.v[cnt] = (*it).v[i];
  120. one.m = min(one.m, (*it).v[i]);
  121. cnt++;
  122. }
  123. two.n = (*it).n - place - 1;
  124. two.v.resize(two.n);
  125. two.m = INF;
  126. cnt = 0;
  127. for (ll i = place + 1; i < (*it).n; i++) {
  128. two.v[cnt] = (*it).v[i];
  129. two.m = min(two.m, (*it).v[i]);
  130. cnt++;
  131. }
  132. (*it) = one;
  133. it++;
  134. b.emplace(it, two);
  135. it--;
  136. return it;
  137. }
  138. ll find_min(ll l, ll r) {
  139. list<block>::iterator start = splitik(l - 1);
  140. list<block>::iterator finish = splitik(r);
  141. ll ans = INF;
  142. while (start != finish) {
  143. ans = min(ans, (*start).m);
  144. start++;
  145. }
  146. return ans;
  147. }
  148. void rev(ll l, ll r) {
  149. list<block>::iterator start = splitik(l - 1);
  150. list<block>::iterator finish = splitik(r);
  151. list<block>::iterator s = start;
  152. while (s != finish) {
  153. (*s).r ^= 1;
  154. s++;
  155. }
  156. reverse(start, finish);
  157. }
  158. };
  159.  
  160. int main() {
  161. ios_base::sync_with_stdio(false);
  162. #ifdef _DEBUG
  163. freopen("input.txt", "r", stdin);
  164. freopen("output.txt", "w", stdout);
  165. #endif
  166. ll n, q;
  167. cin >> n >> q;
  168. vector <ll> v(n);
  169. for (ll i = 0; i < n; i++)
  170. cin >> v[i];
  171. SQRT S(v);
  172. ll checker = 0;
  173. ll modik = sqrt(n + 0.5);
  174. for (ll s = 0; s < q; s++) {
  175. checker++;
  176. if (checker % modik == 0)
  177. S.rebuild();
  178. ll t, l, r;
  179. cin >> t >> l >> r;
  180. l--; r--;
  181. if (t == 2) S.rev(l, r);
  182. else cout << S.find_min(l, r) << endl;
  183. }
  184. return 0;
  185. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement