最大数(提高+/省选-)

来源:互联网 发布:不同后缀的英文域名 编辑:程序博客网 时间:2024/05/23 23:35

题目:

题目描述

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

1、 查询操作。

语法:Q L

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

限制:L不超过当前数列的长度。

2、 插入操作。

语法:A n

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

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

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

输入输出格式

输入格式:
第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足(0

#include<iostream>  #include<cstring>  #include<stdio.h>   using namespace std;  int n,d,t=0; int size;  int a[200010];  int num[200010];  int main()  {      int lt,len=0;      char c[5];      scanf("%d%d",&n,&d);      while(n--)      {          scanf("%s%d\n",c,&lt);         if(c[0] == 'A')//插入        {              lt=(lt+t)%d;              num[++len]=lt;            while(size&&num[a[size]]<=lt) //寻找                size--;            a[++size]=len;          }          else //查询        {              int pos=lower_bound(a+1,a+size+1,len-lt+1)-a;//二分(c++的美好)            t=num[a[pos]];             cout<<t<<endl;          }      }      return 0;  }
1 0