#define N 100100
/******************_单调队列模板_******************/
//基于单调队列功能的单一性:以limit为序查找在一定范围内的极值。
//复杂度:O(n)
//用法: 创建的时候调用.init()
// 插入队列:.push( Q_Node( KEY,LIMIT ) );
// 设置limit值:.setlimit( LIMIT );
// 查询<limit值的最大元素: Q_Node qn; q2.top(qn);
// 再查询前需要设置limit值,如果队列为空返回false,否则将最大元素存入qn中并返回true
struct Q_Node {
int key,limit;//用来比较大小的key和控制存在时间的limit
Q_Node(){}
Q_Node(int _key,int _limit){ key=_key,limit=_limit; }
};
struct Q_Que {
Q_Node Q[N];
int qf,qd;
int limit;// <limit 的元素将被弹出
void init() {
qf = qd = 0;//将队列内元素清空
}
void push(Q_Node newnode) {//默认入队是当前limit最大的
while (qf>qd && Q[qf-1].key < newnode.key) qf--;
Q[qf++] = newnode;
}
void setlimit(int _limit) {
limit = _limit;
}
/*
取出队列中>=limit且key最大的元素。
*/
bool top(Q_Node &rt)
{
while(qf>qd && Q[qd].limit < limit) qd++;
if(qf==qd) return false;
rt = Q[qd];
return true;
}
};