【bzoj1012】[JSOI2008]最大数maxnumber

一开始想动态开点线段树,后来一想这不就是裸的线段树吗
直接建一颗空树一个点一个点的插就好

#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
#include<string>

using namespace std;
int sz,n,m,D,qx;
struct seg{
    int l,r;
    int mx;
}tr[1000010];
inline int F()
{
    register int aa,bb;register char ch;
    while(ch=getchar(),(ch<'0'||ch>'9')&&ch!='-');ch=='-'?aa=bb=0:(aa=ch-'0',bb=1);
    while(ch=getchar(),ch>='0'&&ch<='9')aa=(aa<<3)+(aa<<1)+ch-'0';return bb?aa:-aa;
}
void build(int k,int l,int r)
{
    tr[k].l=l,tr[k].r=r;tr[k].mx=0;
    if (l==r)return;
    int mid=(l+r)>>1;
    build(k<<1,l,mid);
    build(k<<1|1,mid+1,r);
}
void change(int k,int x,int z)
{
    int l=tr[k].l,r=tr[k].r;
    if (l==r)
    {
        tr[k].mx=z;
        return;
    }
    int mid=(l+r)>>1;
    if (x<=mid) change(k<<1,x,z);
    else change(k<<1|1,x,z);
    tr[k].mx=max(tr[k<<1].mx,tr[k<<1|1].mx);
}
void query(int k,int x,int y)
{
    int l=tr[k].l,r=tr[k].r;
    if (x<=l&&r<=y)
    {
        qx=max(qx,tr[k].mx);
        return ;
    }
    int mid=(l+r)>>1;
    if (x<=mid)query(k<<1,x,y);
    if (y>mid)query(k<<1|1,x,y);

}
int main()
{
    char s[3];
    sz=0;qx=0;
    n=F(),D=F();
    build(1,1,n);
    for (int i=1;i<=n;++i)
    {
        scanf("%s",s);
        m=F();
        if (s[0]=='A')
        change(1,++sz,(qx+m)%D);
        else {
            qx=0;
            query(1,sz-m+1,sz);
            printf("%d\n",qx);
        }
    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值