线段树
例题:最大数
【输入样例】
10 100
A 97
Q 1
Q 1
A 17
Q 2
A 63
Q 1
Q 1
Q 3
A 99
【输出样例】
97
97
97
60
60
97
【提示】
样例说明
最后的序列是 97,14,60,96。
数据范围与提示:
对于全部数据,1≤m≤2×105,1≤p≤2×109,0≤t<p。
————————————————————————————————————————————————————
import java.util.Scanner;
public class Main {
static int N = 200010;
static int m, p;
static Node[] tr = new Node[N * 4];
public static void main(String[] args) {
Scanner sc = new Scanner(System.in);
int n = 0, last = 0;
m = sc.nextInt();
p = sc.nextInt();
build(1, 1, m);
int x;
String op = "";
while (m-- > 0) {
op = sc.next();
x = sc.nextInt();
if (op.equals("Q")) {
last = query(1, n - x + 1, n);
System.out.println(last);
} else {
modify(1, n + 1, (last + x) % p);
n++;
}
}
}
private static void build(int u, int l, int r) {
tr[u] = new Node(l, r);
if (l == r) return;
int mid = l + r >> 1;
build(u << 1, l, mid);
build(u << 1 | 1, mid + 1, r);
}
private static void pushup(int u) {
//由子节点的信息,来计算父节点的信息
tr[u].v = Math.max(tr[u << 1].v, tr[u << 1 | 1].v);
}
private static int query(int u, int l, int r) {
//树中节点已经完全被包含在[l,r]中了
if (tr[u].l >= l && tr[u].r <= r) return tr[u].v;
int mid = tr[u].l + tr[u].r >> 1;
int v = 0;
if (l <= mid) {
v = query(u << 1, l, r);
}
if (r > mid) {
v = Math.max(v, query(u << 1 | 1, l, r));
}
return v;
}
private static void modify(int u, int x, int v) {
if (tr[u].l == x && tr[u].r == x) {
tr[u].v = v;
} else {
int mid = tr[u].l + tr[u].r >> 1<