-
Notifications
You must be signed in to change notification settings - Fork 0
/
Copy pathservice_lane.cpp
86 lines (55 loc) · 1.42 KB
/
service_lane.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
#include <iostream>
#include <stdio.h>
#include <stdlib.h>
#include <math.h>
#include <algorithm>
#define MAXN 100000
using namespace std;
struct state {
int val;
};
state node[4*MAXN];
int n, q, from, to;
int A[MAXN+1];
state combine( state q1, state q2 ) {
state ret;
ret.val = min( q1.val, q2.val );
return ( ret );
}
void build( int v, int begin, int end ) {
if ( begin == end ) {
node[v].val = A[begin];
return;
}
int mid = ( begin + end ) / 2;
build( 2*v, begin, mid );
build( 2*v+1, mid+1, end );
node[v] = combine( node[2*v], node[2*v+1] );
}
state query( int v, int x, int y, int qx, int qy ) {
if ( qx == x && qy == y ) {
return ( node[v] );
}
int mid = ( x + y ) / 2;
if ( qy <= mid ) {
return ( query( 2*v, x, mid, qx, qy ) );
}else if ( qx > mid ) {
return ( query( 2*v+1, mid+1, y, qx, qy ) );
}else {
state q1 = query( 2*v, x, mid, qx, mid );
state q2 = query( 2*v+1, mid+1, y, mid+1, qy );
return ( combine( q1, q2 ) );
}
}
int main( ) {
scanf( "%d %d", &n, &q );
for ( int i = 1; i <= n; ++i ) {
scanf( "%d", &A[i] );
}
build( 1, 1, n );
while ( q-- ) {
scanf( "%d %d", &from, &to );
printf( "%d\n", query( 1, 1, n, from+1, to+1 ).val );
}
return 0;
}