bzoj 1012 最大数 线段树 || 分块

来源:互联网 发布:nlp分词算法 编辑:程序博客网 时间:2024/05/22 00:54

线段树提前开20w个点建树就可以直接修改。

#include<iostream>#include<cstdio>#define LL long longusing namespace std;struct xds{    int l,r;    LL ma;}tree[800005];void build(int dq,int l,int r){    tree[dq].l=l;    tree[dq].r=r;    if(l==r)        return ;    int mid=(l+r)>>1;    build(dq<<1,l,mid);    build(dq<<1|1,mid+1,r);}LL ask(int dq,int l,int r){    if(tree[dq].l>=l&&tree[dq].r<=r)        return tree[dq].ma;    LL ans=0;    int mid=(tree[dq].l+tree[dq].r)>>1;    if(mid>=l)        ans=max(ans,ask(dq<<1,l,r));    if(mid<r)        ans=max(ans,ask(dq<<1|1,l,r));    return ans; }void up(int dq){    tree[dq].ma=max(tree[dq<<1].ma,tree[dq<<1|1].ma);}void change(int dq,int c,LL v){    if(tree[dq].l==tree[dq].r)    {        tree[dq].ma=v;        return ;    }    int mid=(tree[dq].r+tree[dq].l)>>1;    if(mid>=c)        change(dq<<1,c,v);    else        change(dq<<1|1,c,v);    up(dq);}int main(){    int m;LL d,n,t=0;int tot=0;    char a;int x;    scanf("%d%lld",&m,&d);    build(1,1,m);    for(int i=1;i<=m;i++)    {        a=getchar();        while(a!='A'&&a!='Q')            a=getchar();        if(a=='Q')        {            scanf("%d",&x);            t=ask(1,tot-x+1,tot);            printf("%d\n",t);        }        else        {            scanf("%lld",&n);            n+=t;n%=d;            tot++;            change(1,tot,n);        }    }    return 0;}
2 0