luogu_1198 [JSOI2008]最大数

Posted Code_Together

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了luogu_1198 [JSOI2008]最大数相关的知识,希望对你有一定的参考价值。

#include <cstdio>
#include <iostream>
#include <algorithm>
#include <cstring>    
using namespace std;
long long n,mod,a[2000010],t,cnt,y;

int Max(int a,int b){
    if(a>=b)return a;
    else return b;
}

inline void update(int l,int r,int now,int v,int o){
    if(l==now && r==now){a[o]=v; return;}
    if(l==r)return;
    int mid=(l+r)>>1;
    if(mid>=now)update(l,mid,now,v,o<<1);
    else update(mid+1,r,now,v,o<<1|1);
    a[o]=Max(a[o<<1],a[o<<1|1]);
}

inline int query(int l,int r,int L,int R,int o){
    if(l>R || r<L)return -1;
    if(L<=l && r<=R)return a[o];
    int mid=(l+r)>>1;
    int q1=query(l,mid,L,R,o<<1);
    int q2=query(mid+1,r,L,R,o<<1|1);
    if(q1==-1)return q2;
    if(q2==-1)return q1;
    return Max(q1,q2);
}

int main(){
    long long k=0;
    scanf("%lld%lld",&n,&mod);
    while((1<<k)<n)k++;
    k=1<<k;
    while(n--){
        char x;
        x=getchar();
        while(x!=‘A‘ && x!=‘Q‘)x=getchar();
        if(x==‘A‘){
            scanf("%lld",&y); y=(y+t)%mod;
            cnt++;
            update(1,k,cnt,y,1);
        }
        else if(x==‘Q‘){
            scanf("%lld",&y);
            t=query(1,k,cnt-y+1,cnt,1);
            printf("%lld\n",t);
        }
    }
    return 0;
}

  

以上是关于luogu_1198 [JSOI2008]最大数的主要内容,如果未能解决你的问题,请参考以下文章

luogu1198 JSOI2008 最大数

luogu P1198 [JSOI2008]最大数

luogu P1198 [JSOI2008]最大数

BZOJ——1012: [JSOI2008]最大数maxnumber || 洛谷—— P1198 [JSOI2008]最大数

洛谷 P1198 [JSOI2008]最大数 题解

[JSOI2008]最大数