[Bzoj1012][JSOI2008]最大数maxnumber(线段树)

题目链接:https://www.lydsy.com/JudgeOnline/problem.php?id=1012

看到单点更新和查询先想到线段树,初始化直接将所有的位置看成0,就只有单点修改和单点查询了。

 1 #include<bits/stdc++.h>
 2 #define lson l,mid,i<<1
 3 #define rson mid+1,r,i<<1|1
 4 #define mid (l+r)/2
 5 using namespace std;
 6 typedef long long ll;
 7 const int maxn = 2e5 + 10;
 8 ll Max[maxn << 2];
 9 inline ll read() {
10     ll n = 0, f = 1; char ch = getchar();
11     while (ch<'0' || ch>'9') { if (ch == '-')f = -1; ch = getchar(); }
12     while (ch >= '0'&&ch <= '9') { n = n * 10 + ch - '0'; ch = getchar(); }
13     return n * f;
14 }
15 void up(int i) {
16     Max[i] = max(Max[i << 1], Max[i << 1 | 1]);
17 }
18 void update(int p, ll x, int l, int r, int i) {
19     if (l == r) {
20         Max[i] = x;
21         return;
22     }
23     if (p <= mid)
24         update(p, x, lson);
25     else
26         update(p, x, rson);
27     up(i);
28 }
29 ll query(int L, int R, int l, int r, int i) {
30     if (L <= l && r <= R)
31         return Max[i];
32     ll MMax = 0;
33     if (L <= mid)
34         MMax = max(MMax, query(L, R, lson));
35     if (R > mid)
36         MMax = max(MMax, query(L, R, rson));
37     return MMax;
38 }
39 char q[3];
40 int main() {
41     ll n, d, x, t = 0, len = 0;
42     n = read(), d = read();
43     for (int i = 1; i <= n; i++) {
44         scanf("%s", q);
45         x = read();
46         if (q[0] == 'A') {
47             x = (x + t) % d;
48             len++;
49             update(len, x, 1, n, 1);
50         }
51         else {
52             t = query(len - x + 1, len, 1, n, 1);
53             printf("%lld\n", t);
54         }
55     }
56 }

 

posted @ 2019-07-01 19:22  祈梦生  阅读(140)  评论(0编辑  收藏  举报