线段树模板题,线段树能解决的范围远多于树状数组,这个题的要求是求区间最大值。
import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStreamReader;
import java.io.PrintWriter;
class Main {
static BufferedReader br = new BufferedReader(new InputStreamReader(System.in));
static PrintWriter pw = new PrintWriter(System.out);
static int N = 100010, n, m;
static int w[] = new int[N];
static Node node[] = new Node[N * 4];
public static void main(String[] rags) throws IOException {
String s[] = br.readLine().split(" ");
n = Integer.parseInt(s[0]);
m = Integer.parseInt(s[1]);
s = br.readLine().split(" ");
for (int i = 1; i <= n; i++) w[i] = Integer.parseInt(s[i - 1]);
build(1, 1, n);
while (m-- > 0) {
s = br.readLine().split(" ");
int a = Integer.parseInt(s[0]);
int b = Integer.parseInt(s[1]);
pw.println(query(1, a, b));
}
pw.flush();
pw.close();
br.close();
}
private static void build(int u, int l, int r) {
if (l == r) node[u] = new Node(l, r, w[r]);
else {
node[u] = new Node(l, r);
int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
node[u].setMax(Math.max(node[u << 1].getMax(), node[u << 1 | 1].getMax()));
}
}
public static int query(int u, int l, int r) {
if (node[u].getL() >= l && node[u].getR() <= r) return node[u].getMax();
int mid = node[u].getL() + node[u].getR() >> 1;
int maxv = Integer.MIN_VALUE;
if (l <= mid) maxv = query(u << 1, l, r);
if (r > mid) maxv = Math.max(maxv, query(u << 1 | 1, l, r));
return maxv;
}
}
class Node {
int l, r, max;
public Node(int l, int r, int max) {
this.l = l;
this.r = r;
this.max = max;
}
public Node(int l, int r) {
this.l = l;
this.r = r;
}
public int getL() {
return l;
}
public void setL(int l) {
this.l = l;
}
public int getR() {
return r;
}
public void setR(int r) {
this.r = r;
}
public int getMax() {
return max;
}
public void setMax(int max) {
this.max = max;
}
}