[JSOI2008]最大数MAXNUMBER——牛客网

登录—专业IT笔试面试备考平台_牛客网

 

#include <bits/stdc++.h>
using namespace std;
typedef long long ll;
const int N=200100;
struct node{
    ll l,r;
    ll num;
}tree[4*N];
void build(int p,int l,int r){//递归建树
    tree[p].l=l,tree[p].r=r;
    if(l==r){//如果结点是叶子结点
        tree[p].num=0;
        return ;
    }
    int mid=(l+r)/2;
    build(p*2,l,mid);//建立左子树
    build(p*2+1,mid+1,r);//建立右子树
    tree[p].num=max(tree[p*2].num,tree[p*2+1].num);//该结点的和等于左子树的和加上右子树的和
    
}
void insert(int p,int pos,int k){//插入操作
    if(tree[p].l==pos&&tree[p].r==pos){//如果该节点是叶子结点,并且是要插入的位置把该点的值更改,并返回
        tree[p].num=k;
        return ;
    }
    int mid=(tree[p].l+tree[p].r)/2;
    if(pos<=mid)insert(p*2,pos,k);//如果该位置小于区间中值,向左子树查找
    else insert(p*2+1,pos,k);//否则向右子树查找
    tree[p].num=max(tree[p*2].num,tree[p*2+1].num);//顺便把该节点的最大值更新
}
int check(int p,int l,int r){//查询操作
    if(tree[p].l>=l&&tree[p].r<=r){//如果该节点在要查询区间范围内,直接返回该结点的最大值
        return tree[p].num;
    }
    int mid=(tree[p].l+tree[p].r)/2;
    ll m1=0,m2=0;
    if(l<=mid)m1=check(p*2,l,r);//如果区间与右子树有交集,查询右子树
    if(r>mid)m2=check(p*2+1,l,r);//如果区间与左子树有交集,查询左子树
    return max(m1,m2);
}  
int pre=0,cnt=0;
int main(){
    ll n,m;
    cin>>n>>m;
    build(1,1,N);//建树
    while(n--){
        char a;
        ll k;
        cin>>a>>k;
        if(a=='A'){//插入操作
          //  cout<<"/"<<k+t<<endl;
            ll nu=(k+pre)%m;
         //   cout<<"nu"<<nu<<endl;
            cnt++;
            insert(1,cnt,nu);
        }
        else {//查询操作
            pre=check(1,cnt-k+1,cnt);
            cout<<pre<<endl;
        }
    }
    return 0;
}

 

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值