Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- Даша, SQRT1, C
- #define _CRT_SECURE_NO_WARNINGS
- #pragma comment(linker, "/STACK:66777216")
- #include <iostream>
- #include <iomanip>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <string>
- #include <map>
- #include <set>
- #include <queue>
- #include <bitset>
- #include <list>
- #define endl "\n"
- using namespace std;
- typedef long long ll;
- typedef unsigned long long ull;
- typedef pair <ll, ll> pii;
- typedef pair <ll, ll> pil;
- typedef pair <ll, ll> pll;
- typedef vector <ll> vi;
- typedef vector <ll> vll;
- typedef vector <string> vstr;
- typedef vector < vector <ll> > vvi;
- typedef vector < vector <ll> > vvll;
- ll inf = 1e9 + 7;
- ll INF = 1e18;
- ll gcd(ll a, ll b) { return b ? gcd(b, a % b) : a; }
- struct block {
- ll n;
- ll r;
- vector <ll> v;
- ll m;
- block() {
- r = 0;
- }
- };
- struct SQRT {
- list<block> b;
- vector <ll> a;
- ll k, n, m;
- SQRT(vector <ll> &a) {
- this->a = a;
- build();
- }
- void build() {
- n = a.size();
- k = sqrt(n + 0.5);
- m = (n + k - 1) / k;
- b.resize(m);
- int i = 0;
- for (list<block>::iterator it = b.begin(); it != b.end() && i < m; it++, i++) {
- (*it).m = INF;
- (*it).n = min(k, n - i * k);
- (*it).r = 0;
- (*it).v.resize((*it).n);
- int cnt = 0;
- for (ll j = i * k; j < i * k + k && j < n; j++, cnt++) {
- (*it).v[cnt] = (a[j]);
- (*it).m = min(a[j], (*it).m);
- }
- }
- }
- void rebuild() {
- list<block>::iterator it = b.begin();
- int j = 0;
- while (it != b.end()) {
- if ((*it).r)
- for (ll i = (*it).n - 1; i >= 0; i--)
- a[j] = (*it).v[i], j++;
- else
- for (ll i = 0; i < (*it).n; i++)
- a[j] = (*it).v[i], j++;
- it++;
- }
- b.clear();
- build();
- }
- list<block>::iterator find_block(ll j) {
- ll count = 0;
- list<block>::iterator it = b.begin();
- while (count + (*it).n <= j) {
- count += (*it).n;
- it++;
- }
- return it;
- }
- pair<list<block>::iterator, ll> find_place(ll j) {
- ll count = 0;
- list<block>::iterator it = b.begin();
- while (count + (*it).n <= j) {
- count += (*it).n;
- it++;
- }
- return make_pair(it, j - count);
- }
- list<block>::iterator splitik(int j) {
- if (j < 0) return b.begin();
- pair<list<block>::iterator, ll> temp = find_place(j);
- list<block>::iterator it = temp.first;
- ll place = temp.second;
- if ((*it).r) {
- reverse((*it).v.begin(), (*it).v.end());
- (*it).r = 0;
- }
- if (place + 1 == (*it).n) {
- it++;
- return it;
- }
- block one, two;
- one.n = place + 1;
- one.v.resize(one.n);
- one.m = INF;
- int cnt = 0;
- for (ll i = 0; i <= place; i++) {
- one.v[cnt] = (*it).v[i];
- one.m = min(one.m, (*it).v[i]);
- cnt++;
- }
- two.n = (*it).n - place - 1;
- two.v.resize(two.n);
- two.m = INF;
- cnt = 0;
- for (ll i = place + 1; i < (*it).n; i++) {
- two.v[cnt] = (*it).v[i];
- two.m = min(two.m, (*it).v[i]);
- cnt++;
- }
- (*it) = one;
- it++;
- b.emplace(it, two);
- it--;
- return it;
- }
- ll find_min(ll l, ll r) {
- list<block>::iterator start = splitik(l - 1);
- list<block>::iterator finish = splitik(r);
- ll ans = INF;
- while (start != finish) {
- ans = min(ans, (*start).m);
- start++;
- }
- return ans;
- }
- void rev(ll l, ll r) {
- list<block>::iterator start = splitik(l - 1);
- list<block>::iterator finish = splitik(r);
- list<block>::iterator s = start;
- while (s != finish) {
- (*s).r ^= 1;
- s++;
- }
- reverse(start, finish);
- }
- };
- int main() {
- ios_base::sync_with_stdio(false);
- #ifdef _DEBUG
- freopen("input.txt", "r", stdin);
- freopen("output.txt", "w", stdout);
- #endif
- ll n, q;
- cin >> n >> q;
- vector <ll> v(n);
- for (ll i = 0; i < n; i++)
- cin >> v[i];
- SQRT S(v);
- ll checker = 0;
- ll modik = sqrt(n + 0.5);
- for (ll s = 0; s < q; s++) {
- checker++;
- if (checker % modik == 0)
- S.rebuild();
- ll t, l, r;
- cin >> t >> l >> r;
- l--; r--;
- if (t == 2) S.rev(l, r);
- else cout << S.find_min(l, r) << endl;
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement