Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #pragma GCC optimize("O3", "unroll-loops")
- #pragma GCC target("avx2")
- #include <iostream>
- #include <iomanip>
- #include <vector>
- #include <algorithm>
- #include <cmath>
- #include <string>
- #include <map>
- #include <unordered_map>
- #include <set>
- #include <unordered_set>
- #include <bitset>
- #include <sstream>
- #include <deque>
- #include <queue>
- #include <random>
- #include <cassert>
- using namespace std;
- #define FAST ios_base::sync_with_stdio(0); cin.tie(0); cout.tie(0)
- #define FIXED cout << fixed << setprecision(12)
- #define RANDOM srand(94385)
- #define ll long long
- #define ld long double
- #define pii pair<int, int>
- #define pll pair<ll, ll>
- #define graph vector<vector<int>>
- #define pb push_back
- #define pf push_front
- #define popb pop_back
- #define popf pop_front
- #define f first
- #define s second
- #define hashmap unordered_map
- #define hashset unordered_set
- #define eps 1e-9
- #define mod 1000000007
- #define inf 3000000000000000007ll
- #define sz(a) signed(a.size())
- #define all(a) a.begin(), a.end()
- #define rall(a) a.rbegin(), a.rend()
- template<class T, class U> inline void checkmin(T &x, U y) { if (y < x) x = y; }
- template<class T, class U> inline void checkmax(T &x, U y) { if (y > x) x = y; }
- template<class T, class U> inline bool ifmax(T &x, U y) { if (y > x) return x = y, true; return false; }
- template<class T, class U> inline bool ifmin(T &x, U y) { if (y < x) return x = y, true; return false; }
- template<class T> inline void sort(T &a) { sort(all(a)); }
- template<class T> inline void rsort(T &a) { sort(rall(a)); }
- template<class T> inline void reverse(T &a) { reverse(all(a)); }
- template<class T, class U> inline istream& operator>>(istream& str, pair<T, U> &p) { return str >> p.f >> p.s; }
- template<class T> inline istream& operator>>(istream& str, vector<T> &a) { for (auto &i : a) str >> i; return str; }
- template<class T> inline T sorted(T a) { sort(a); return a; }
- template<class T>
- struct sparse {
- static const int LOG = 18;
- static const int N = 2e5 + 10;
- int mx2[N];
- T v[LOG][N];
- sparse(vector<T> a, T (*cmp)(T, T)) {
- for (int i = 2; i < N; ++i) mx2[i] = mx2[i >> 1] + 1;
- int n = sz(a);
- for (int i = 0; i < n; ++i) v[0][i] = a[i];
- for (int l = 1; l < LOG; ++l)
- for (int i = 0; i + (1 << l) <= n; ++i)
- v[l][i] = cmp(v[l - 1][i], v[l - 1][i + (1 << l - 1)]);
- }
- T get(int l, int r) {
- int mx = mx2[r - l + 1];
- return cmp(v[mx][l], v[mx][r - (1 << mx) + 1]);
- }
- };
- signed main() {
- FAST; FIXED; RANDOM;
- vector<int> a = {1, 2, 3, 4, 5};
- sparse<int> sp(a, min);
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement