[JSOI2008]最大数

这道题是板子题,用来练习线段树。

 1 #include <bits/stdc++.h>
 2 
 3 using namespace std;
 4 
 5 #define re register
 6 #define rep(i, a, b) for (re int i = a; i <= b; ++i)
 7 #define repd(i, a, b) for (re int i = a; i >= b; --i)
 8 #define maxx(a, b) a = max(a, b);
 9 #define minn(a, b) a = min(a, b);
10 #define LL long long
11 #define inf (1 << 30)
12 
13 const int maxn = 2e5 + 5, N = 2e5;
14 
15 struct Seg_T {
16 #define lson (o << 1)
17 #define rson (o << 1 | 1)
18     int v[maxn << 4];
19     void pushup(int o) { v[o] = max(v[lson], v[rson]); }
20     void add(int o, int l, int r, int x, int t) {
21         if (l == r) { v[o] = t; return; }
22         int mid = (l + r) >> 1;
23         if (x <= mid) add(lson, l, mid, x, t);
24         else add(rson, mid+1, r, x, t);
25         pushup(o);
26     }
27     int query(int o, int l, int r, int ql, int qr) {
28         if (ql <= l && r <= qr) return v[o];
29         int mid = (l + r) >> 1, ans = 0;
30         if (ql <= mid) ans = max(ans, query(lson, l, mid, ql, qr));
31         if (mid < qr) ans = max(ans, query(rson, mid+1, r, ql, qr));
32         return ans;
33     }
34 } S;
35 
36 int n, L = 0;
37 LL D, t;
38 
39 int main() {
40     scanf("%d %lld", &n, &D);
41 
42     rep(i, 1, n) {
43         char c[2]; LL x;
44         scanf("%s %lld", c, &x);
45         if (c[0] == 'Q') printf("%lld\n", t = S.query(1, 1, N, L-x+1, L));
46         else {
47             L++;
48             S.add(1, 1, N, L, (t+x) % D);
49         }
50     }
51 
52     return 0;
53 }

 

posted @ 2019-01-27 00:27  AC-Evil  阅读(376)  评论(0编辑  收藏  举报