首页 > 技术文章 > Cogs 1844. [JSOI2008]最大数maxnumber

nancheng58 2016-08-02 08:20 原文

  1. [JSOI2008]最大数maxnumber
    ★★ 输入文件:bzoj_1012.in 输出文件:bzoj_1012.out 简单对比
    时间限制:3 s 内存限制:162 MB
    【题目描述】
    现在请求你维护一个数列,要求提供以下两种操作: 1、 查询操作。语法:Q L 功能:查询当前数列中末尾L个数中的最大的数,并输出这个数的值。限制:L不超过当前数列的长度。 2、 插入操作。语法:A n 功能:将n加上t,其中t是最近一次查询操作的答案(如果还未执行过查询操作,则t=0),并将所得结果对一个固定的常数D取模,将所得答案插入到数列的末尾。限制:n是非负整数并且在长整范围内。注意:初始时数列是空的,没有一个数。
    【输入格式】
    第一行两个整数,M和D,其中M表示操作的个数(M <= 200,000),D如上文中所述,满足1≤int64max
    【输出格式】
    对于每一个查询操作,你应该按照顺序依次输出结果,每个结果占一行。
    【样例输入】
    5 100
    A 96
    Q 1
    A 97
    Q 1
    Q 2
    【样例输出】
    96
    93
    96
    【题目来源】
    耒阳大视野(衡阳八中) OJ 1012
/*
区间修改+求区间max. 
*/
#include<iostream>
#include<cmath>
#include<cstdio>
#define LL long long
#define MAXN 200001
using namespace std;
LL n,m,cut,mod;
struct data{
    LL l,r,lc,rc,sum,bj;
}tree[MAXN*4];
LL read(){
    LL x=0,f=1;char ch=getchar();
    while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9')x=x*10+ch-48,ch=getchar();
    return x*f;
}
void build(LL l,LL r){
    LL k=++cut;
    tree[k].l=l,tree[k].r=r;
    if(l==r){
        tree[k].sum=0;
        return ;
    }
    LL mid=(l+r)>>1;
    tree[k].lc=cut+1;
    build(l,mid);
    tree[k].rc=cut+1;
    build(mid+1,r);
}
void change(LL k,LL p,LL add){
    if(tree[k].l==tree[k].r&&tree[k].l==p){
        tree[k].sum=add;
        return ;
    }
    LL mid=(tree[k].l+tree[k].r)>>1;
    if(p<=mid) change(tree[k].lc,p,add);
    else if(p>mid) change(tree[k].rc,p,add);
    tree[k].sum=max(tree[tree[k].lc].sum,tree[tree[k].rc].sum);
}
LL query(LL k,LL l,LL r){
    if(l<=tree[k].l&&tree[k].r<=r) return tree[k].sum;
    LL tot=-0x7fffffff;
    LL mid=(tree[k].l+tree[k].r)>>1;
    if(r<=mid) tot=max(query(tree[k].lc,l,r),tot);
    else if(l>mid) tot=max(query(tree[k].rc,l,r),tot);
    else tot=max(max(query(tree[k].lc,l,mid),query(tree[k].rc,mid+1,r)),tot);
    return tot;
}
int main(){
    freopen("bzoj_1012.in","r",stdin);
    freopen("bzoj_1012.out","w",stdout);
    LL x,y,z,p=0;
    char ch;
    m=read();mod=read();build(1,m);
    for(int i=1;i<=m;i++){
        cin>>ch;x=read();
        if(ch=='A') change(1,++n,(x+p+mod)%mod);
        else {
            p=query(1,n-x+1,n);
            cout<<p;printf("\n");
        }
    }
    return 0;
}

推荐阅读