题目描述

现在请求你维护一个数列,要求提供以下两种操作:

1、 查询操作。

语法:Q L

功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。

限制:LLL不超过当前数列的长度。(L>0)(L > 0)(L>0)

2、 插入操作。

语法:A n

功能:将nnn加上ttt,其中ttt是最近一次查询操作的答案(如果还未执行过查询操作,则t=0t=0t=0),并将所得结果对一个固定的常数DDD取模,将所得答案插入到数列的末尾。

限制:nnn是整数(可能为负数)并且在长整范围内。

注意:初始时数列是空的,没有一个数。

输入格式

第一行两个整数,MMM和DDD,其中MMM表示操作的个数(M≤200,000)(M \le 200,000)(M≤200,000),DDD如上文中所述,满足(0<D<2,000,000,000)(0<D<2,000,000,000)(0<D<2,000,000,000)

接下来的MMM行,每行一个字符串,描述一个具体的操作。语法如上文所述。

输出格式

对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。

输入输出样例

输入 #1

5 100
A 96
Q 1
A 97
Q 1
Q 2
输出 #1

96
93
96 线段树裸题。有这么几个需要注意的地方:
1.要错误理解当前序列最右侧与整个线段树最右侧叶子节点的关系!事先建树时是按照最大规模建的,所以在不断加入点的过程中序列最右端对应的叶子节点实际上是在线段树的最左与最右边叶子节点之内的。
2.INF一定要足够大,0x3f3f3f3f3f3f3f3f可以保证不爆。
3.对于Q,A若用scanf读取最好是%s,不然的话处理换行符会比较啰嗦。
#include <bits/stdc++.h>
#define INF 0x3f3f3f3f3f3f3f3f
using namespace std;
int M,D;
long long length=;
struct SegmentTree
{
int l;
int r;
long long val;
}t[];
void build(int k,int l,int r)
{
t[k].val=-INF;
t[k].l=l;
t[k].r=r;
if(l==r)
{
return;
}
int mid=(l+r)/;
build(*k,l,mid);
build(*k+,mid+,r);
}
long long query(int k,int l,int r,int x,int y)//k为当前节点编号,l为当前节点覆盖区间左端点,r为右端点,x是操作区间左端点,y为操作区间右端点
{
if(l>=x&&r<=y)return t[k].val;
int mid=(l+r)/;
long long ans=-INF; //赋值为负无穷
if(mid>=x)
{
ans=query(*k,l,mid,x,y);
}
if(y>mid)ans=max(ans,query(*k+,mid+,r,x,y));//线段树常见套路
return ans;
}
void add(int k,int l,int r,int y,int num)//num为操作数,其他类似
{
if(l==r)
{
t[k].val=num;
return;
}
int mid=(l+r)/;
if(y<=mid)add(*k,l,mid,y,num);//y代表了单点操作的点的位置。这个题y即为当前序列最右边的位置 。注意!!不要错误理解当前序列最右侧与整个线段树最右侧叶子节点的关系!事先建树时是按照最大规模建的,所以在不断加入点的过程中序列最右端对应的叶子节点实际上是在线段树的叶子节点之内的
else add(*k+,mid+,r,y,num);
t[k].val=max(t[*k].val,t[*k+].val);//不要忘记向上更新
}
int main()
{
cin>>M>>D;
long long last=;
build(,,);
while(M--)
{
char c[];
long long temp;
scanf("%s%lld",&c,&temp);
if(c[]=='A')
{
length++;
add(,,,length,(temp+last)%D);//
}
else if(c[]=='Q')
{
long long ans=query(,,,length-temp+,length);
last=ans;
printf("%lld\n",ans);
}
}
return ;
}


最新文章

  1. Apworks框架实战
  2. 10个常见的Node.js面试题
  3. ajax返回json数据,对其中日期的解析
  4. git 命令使用总结
  5. js实现图片实时预览
  6. viewpaper 抽屉
  7. 修改mongodb3.0副本集用户密码遇到的坑
  8. JSON对象如何转化为字符串?
  9. Hello World for U (20)
  10. .woff 文件404,配置到web.config
  11. View获取焦点
  12. Codeforces Round #258 (Div. 2)[ABCD]
  13. 质因数分解的rho以及miller-rabin
  14. 针对iPhone的pt、Android的dp、HTML的css像素与dpr、设计尺寸和物理像素的浅分析
  15. js 获取屏幕或元素宽高...
  16. 将.csv数据导入到mysql中
  17. git 出现冲突时的解决办法
  18. 详解SQL中的GROUP BY语句
  19. 最近比赛中遇到的几道dp题
  20. 十二生肖查询网页版制作(php)

热门文章

  1. Analog power pin UPF defination
  2. 清空表单 autocomplete=&quot;off&quot;
  3. 初识HttpRunner
  4. thinkphp 3.2链接Oracle数据库,查询数据
  5. Java面向对象的局部变量和成员变量
  6. JS的起源和发展
  7. 第六节:前后端交互之axios用法及async异步编程
  8. python中的分号(“;”)
  9. jQuery选择器的使用注意事项:
  10. Git 安装配置及工作流程