bzoj 1012 [JSOI2008]最大数maxnumber

来源:互联网 发布:三合一企业网站源码 编辑:程序博客网 时间:2024/05/21 16:54

裸的线段树。。


#include <cstdio>using namespace std;int m,d;struct VV{    int l,r;    int ma;}tr[800005];inline int max(int i,int j) {return i>j?i:j;}void build_tr(int l,int r,int k){    tr[k].l=l;tr[k].r=r;    if (l==r) return ;    int mid=(l+r)>>1;    tr[k].ma=-1;    build_tr(l,mid,k<<1);    build_tr(mid+1,r,(k<<1)+1);    return ;}void insert(int k,int we,int ans){    int l=tr[k].l,r=tr[k].r;    if (l==r)    {        tr[k].ma=ans;        return;    }    int mid=(l+r)>>1;    if (we<=mid) insert(k<<1,we,ans);    else insert((k<<1)+1,we,ans);    tr[k].ma=max(tr[k<<1].ma,tr[k<<1|1].ma);    return ;}int ask(int k,int x,int y){    int l=tr[k].l,r=tr[k].r;    if (y<l||x>r) return -1;    if (x<=l&&y>=r)    {        return tr[k].ma;    }    int mid=(l+r)>>1;    int ma=0;    if (y>mid) ma=max(ma,ask(k<<1|1,x,y));    if (x<=mid) ma=max(ma,ask(k<<1,x,y));    return ma;}int main(){    register int i;    scanf("%d %d",&m,&d);    build_tr(1,m,1);    int qu=0;int le=0;    for (i=1;i<=m;i++)    {        char c='1';int x;        while(c!='A'&&c!='Q') c=getchar();        scanf("%d",&x);        if (c=='A') insert(1,++le,(qu+x)%d);        if (c=='Q') printf("%d\n",qu=ask(1,le-x+1,le));    }    return 0;}


0 0
原创粉丝点击