b_lg_最大数 & I Hate It(单点插入)

两种操作:

  • 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;
}
posted @ 2020-11-03 18:55  童年の波鞋  阅读(85)  评论(0编辑  收藏  举报