题目大意:。。。自己看
题目大意:。。。我还是说说吧 给定一个初始为空的序列 提供两种操作:
1.查询序列后Q个数字中的最大值
2.在序列尾部插入(n+t)%d,其中t是上一次查询的结果
首先我们发现 如果一个数的右面有一个比他大的数,那么这个数永远不会成为最大值 他就会被弹掉
说白了这题要维护一个单调递减的单调栈 对于每次查询我们二分查找L的位置即可
这题线段树也能写 而且大多数人写的都是线段树 好麻烦的说 自己斟酌把
#include<cstdio>
#include<cstring>
#include<iostream>
#include<algorithm>
#define M 200200
using namespace std;
struct abcd{
int num,pos;
}stack[M];int top;
void insert(int num,int pos)
{
abcd x;
x.num=num;
x.pos=pos;
while( top && num>stack[top].num )
stack[top--]=stack[0];
stack[++top]=x;
}
bool operator < (int x,abcd y)
{
return x<y.pos;
}
int m,d,n,t,now;
int main()
{
int i,x;
char p[100];
cin>>m>>d;
for(i=1;i<=m;i++)
{
scanf("%s",p);
if(p[0]=='A')
{
scanf("%d",&n);
n+=t;n%=d;
insert(n,++now);
}
else
{
scanf("%d",&x);
t=upper_bound(stack+1,stack+top+1,now-x)->num;
printf("%d\n",t);
}
}
}