JSOI最大值 (线段树)

change 单点修改

query 区间最值

 1 Program XJOI2321;
 2 const maxn=200008;
 3 var l,r,max:array[0..maxn*4] of longint;
 4     i,m,n,ans,p,x:longint;
 5     ch:char;
 6 function mx(a,b:longint):longint;
 7 begin
 8     if a>b then exit(a) else exit(b);
 9 end;
10 procedure up(x:longint);
11 begin
12     max[x]:=mx(max[x*2],max[x*2+1]);
13 end;
14 procedure build(x,lt,rt:longint);
15 var mid:longint;
16 begin
17     l[x]:=lt;
18     r[x]:=rt;
19     if lt=rt then
20     begin
21         max[i]:=0;
22         exit;
23     end;
24     mid:=(lt+rt) div 2;
25     build(x*2,lt,mid);
26     build(x*2+1,mid+1,rt);
27     up(x);
28 end;
29 procedure change(x,G,val:longint);
30 var mid:longint;
31 begin
32     if l[x]=r[x] then
33     begin
34         max[x]:=val;
35         exit;
36     end;
37     mid:=(l[x]+r[x]) div 2;
38     if G<=mid then change(x*2,G,val) else change(x*2+1,G,val);
39     up(x);
40 end;
41 function query(x,lt,rt:longint):longint;
42 var mid,as:longint;
43 begin
44     if (lt<=l[x]) and (r[x]<=rt) then exit(max[x]);
45     mid:=(l[x]+r[x]) div 2;
46     as:=0;
47     if lt<=mid then as:=mx(as,query(x*2,lt,rt));
48     if mid<rt  then as:=mx(as,query(x*2+1,lt,rt));
49     exit(as);
50 end;
51 begin
52     readln(m,p);
53     ans:=0; n:=0;
54     build(1,1,m);
55     for i:=1 to m do
56     begin
57         readln(ch,x);
58         if ch='A' then
59         begin
60             x:=(x+ans) mod p;
61             inc(n);
62             change(1,n,x);
63         end else
64         begin
65             ans:=query(1,n-x+1,n);
66             writeln(ans);
67         end;
68     
69     end;
70 
71 end.

 

转载于:https://www.cnblogs.com/rpSebastian/p/4204691.html

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值