JSOI2008 最大值

最後一個點wa

//單點修改,區間查詢
#include<iostream>
#include<cstdio>
#include<cstring>
#include<cmath>
#include<algorithm>
using namespace std;
long long m,D;
struct TRE{
    int l,r;
    long long mx;
}tre[800005];//***
void pushup(int rt)
{
    tre[rt].mx=max(tre[rt<<1].mx,tre[rt<<1|1].mx);
}
void build(int rt,int L,int R)
{
    if(L==R){
        tre[rt].mx=0;
        tre[rt].l=L;
        tre[rt].r=R;
        return ;
    }
    tre[rt].l=L;
    tre[rt].r=R;
    int mid=(L+R)>>1;
    build(rt<<1,L,mid);
    build(rt<<1|1,mid+1,R);
    pushup(rt);
}
void update(int rt,int ps,int c)
{
    if(tre[rt].l==tre[rt].r)
    {
        tre[rt].mx+=c;
        return;
    }
    int mid=(tre[rt].l+tre[rt].r)>>1;
    if(ps<=mid)
        update(rt<<1,ps,c);
    else
        update(rt<<1|1,ps,c);
    pushup(rt);
}
long long query(int rt,int L,int R)
{
    if(L<=tre[rt].l && R>=tre[rt].r)
    {
        return tre[rt].mx;
    } 
    int mid=(tre[rt].l+tre[rt].r)>>1;
    long long rst=-1e18;
    if(L<=mid) rst=max(rst,query(rt<<1,L,R));
    if(R>=mid+1) rst=max(rst,query(rt<<1|1,L,R));
    return rst; 
}
int main()
{
    scanf("%d%d",&m,&D); 
    build(1,1,m);
    long long t=0,n=0;int pos=0;
    char q;
    for(int i=1;i<=m;i++)
    {
        scanf(" %c%d",&q,&n);
        if(q=='A')
        {
            update(1,++pos,(t+n)%D);//負數模一個正數的餘數 
        } 
        else
        {
            t=query(1,pos-n+1,m);//查詢mn-n+1到m的最大值 
            cout<<t<<endl;
        }       
    }   
}
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章