首页 > 其他 > 详细

b_lg_最大数(单点插入)

时间:2020-11-03 20:50:06      阅读:31      评论:0      收藏:0      [点我收藏+]

两种操作:

  • Q L:查询当前数列中末尾L个数中的最大的数
  • A n:将n加上t,其中t是最近一次查询操作的答案
#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=2e5+5, inf=0x3f3f3f3f;
ll m,mod,len,last,a[N<<2];
void add(int l, int r, ll v, int pos, int k) { //pos是插入位置
    if (l==r) {
        a[k]=v;
        return;
    }
    int m=l+r>>1;
    if (m>=pos) add(l,m,v,pos,k<<1);
    else add(m+1,r,v,pos,k<<1|1);
    a[k]=max(a[k<<1], a[k<<1|1]);
}
ll ask(int ql, int qr, int l, int r, int k) {
    if (ql<=l && r<=qr)
        return a[k];
    ll m=l+r>>1, mx=-inf;
    if (m>=ql) mx=max(mx, ask(ql,qr,l,m,k<<1));
    if (m<qr)  mx=max(mx, ask(ql,qr,m+1,r,k<<1|1));
    return mx;
}
int main() {
    std::ios::sync_with_stdio(false); cin.tie(0); cout.tie(0);
    cin>>m>>mod;
    for (int i=0; i<m; i++) {
        char t; int n; cin>>t>>n;
        if (t==‘A‘) {
            add(1,m,(last+n)%mod,++len,1);
        } else {
            if (n==0) last=0;
            else last=ask(len-n+1,len,1,m,1);
            cout<<last<<‘\n‘;
        }
    }
    return 0;
}

b_lg_最大数(单点插入)

原文:https://www.cnblogs.com/wdt1/p/13921894.html

(0)
(0)
   
举报
评论 一句话评论(0
关于我们 - 联系我们 - 留言反馈 - 联系我们:wmxa8@hotmail.com
© 2014 bubuko.com 版权所有
打开技术之扣,分享程序人生!