Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <iostream>
- #include <string>
- #include <cstring>
- #include <algorithm>
- #include <cmath>
- #include <vector>
- #include <set>
- #include <map>
- #include <stack>
- #include <queue>
- #include <deque>
- #include <unordered_map>
- #include <numeric>
- #include <iomanip>
- using namespace std;
- #define pii pair<long long, long long>
- #define ll long long
- #define FAST ios_base::sync_with_stdio(false); cin.tie(NULL)
- const long long dx[4] = {0, 1, 0, -1}, dy[4] = {1, 0, -1, 0};
- const long long dl[2] = {1, -1};
- const long long MOD = 1000000007;
- const long long MAXN = 100005;
- int N, M;
- int arr[MAXN];
- int seg_min[MAXN * 4];
- int seg_max[MAXN * 4];
- int sz;
- void find_sz(){
- int x = 1;
- while(x < N){
- x *= 2;
- }
- sz = x;
- }
- void build(){
- for(int i = 0; i < N; i++){
- seg_min[sz + i] = arr[i];
- seg_max[sz + i] = arr[i];
- }
- for(int i = sz - 1; i >= 1; i--){
- seg_min[i] = min(seg_min[i * 2], seg_min[i * 2 + 1]);
- seg_max[i] = max(seg_max[i * 2], seg_max[i * 2 + 1]);
- }
- }
- int query_min(int l, int r){
- l += sz;
- r += sz;
- int ret = 2e9;
- while(l <= r){
- if(l % 2 == 1){
- ret = min(ret, seg_min[l]);
- l++;
- }
- if(r % 2 == 0){
- ret = min(ret, seg_min[r]);
- r--;
- }
- l /= 2; r /= 2;
- }
- return ret;
- }
- int query_max(int l, int r){
- l += sz;
- r += sz;
- int ret = 0;
- while(l <= r){
- if(l % 2 == 1){
- ret = max(ret, seg_max[l]);
- l++;
- }
- if(r % 2 == 0){
- ret = max(ret, seg_max[r]);
- r--;
- }
- l /= 2; r /= 2;
- }
- return ret;
- }
- int main() {
- FAST;
- cin >> N >> M;
- for(int i = 0; i < N; i++){
- cin >> arr[i];
- }
- find_sz();
- build();
- for(int i = 0; i < M; i++){
- int a, b;
- cin >> a >> b;
- a--;
- b--;
- if(a > b) swap(a, b);
- cout << query_min(a, b) << " " << query_max(a, b) << "\n";
- }
- }
- /*
- 10 4
- 75
- 30
- 100
- 38
- 50
- 51
- 52
- 20
- 81
- 5
- 1 10
- 3 5
- 6 9
- 8 10
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement