-
Notifications
You must be signed in to change notification settings - Fork 0
Expand file tree
/
Copy pathMordor.java
More file actions
87 lines (78 loc) · 2.64 KB
/
Mordor.java
File metadata and controls
87 lines (78 loc) · 2.64 KB
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
87
/**
* ODOC _ 1st commit
* @author: Sean Lee
* @Document written 2020.02.25
*
*/
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.util.StringTokenizer;
/**
* Mordor: Main class
* @main: collect input and run methods
*/
class Mordor{
public static void main(String[] args) throws IOException{
/**
* main: collect input and run methods
* @ param int c : how many rounds to run
* @ param int n = numbers of signs
* @ param int
*/
BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
int c = Integer.parseInt(br.readLine());
while(c-->0){
String s = br.readLine();
StringTokenizer st = new StringTokenizer(s);
int n = Integer.parseInt(st.nextToken());
int q = Integer.parseInt(st.nextToken());
int[] nArray = new int[n];
s = br.readLine();
st = new StringTokenizer(s);
for(int j=0;j<n;j++) nArray[j]=Integer.parseInt(st.nextToken());
RMQ minRMQ = new RMQ(nArray);
for(int j=0;j<n;j++) nArray[j]*=-1;
RMQ maxRMQ = new RMQ(nArray);
for(int j=0;j<q;j++){
s = br.readLine();
st = new StringTokenizer(s);
int no1 = Integer.parseInt(st.nextToken());
int no2 = Integer.parseInt(st.nextToken());
System.out.println(maxRMQ.query(no1,no2)*-1 - minRMQ.query(no1,no2));
}
}
}
}
/**
*
*/
class RMQ{
private final int INF = 987654321;
private int n;
private int minRange[];
public RMQ(int[] arr){
n = arr.length;
minRange = new int[4*n];
init(arr,0,n-1,1);
}
private int init(int[] arr, int left, int right, int node){
if(left==right) return minRange[node] = arr[left];
int mid = (left+right)/2;
int minLeft= init(arr,left,mid,node*2);
int minRight = init(arr,mid+1,right,node*2+1);
return minRange[node] = min(minLeft,minRight);
}
public int min(int a, int b){
return (a>b)?b:a;
}
public int query(int left, int right){
return query(left,right,1,0,n-1);
}
public int query(int left, int right, int node, int leftNode, int rightNode){
if(right<leftNode || left>rightNode) return INF;
if(left <= leftNode && rightNode <= right) return minRange[node];
int mid = (leftNode + rightNode) / 2;
return min(query(left, right, node*2, leftNode, mid),query(left,right,node*2+1, mid+1, rightNode));
}
}