第 45 届国际大学生程序设计竞赛(ICPC)亚洲区域赛(昆明) M.Stone Games(主席树)

 

 

const int N=1e6+5;
 
    int n,m,_;
    int i,j,k;
    int a[N];
    struct Node
    {
        int l,r;
        ll sum;
    }t[N*40];
    int root[N],tot=0,len;
    vector<int> v;
    int x,y;

void update(int &x,int y,int pos,int l,int r)
{
    x=++tot;
    t[x]=t[y];
    if(l==r) t[x].sum+=v[l-1];
    else{
        int mid=l+r>>1;
        if(mid>=pos) update(t[x].l,t[y].l,pos,l,mid);
        else update(t[x].r,t[y].r,pos,mid+1,r);
        t[x].sum=t[t[x].l].sum+t[t[x].r].sum;
    }
}

ll query(int x,int y,int L,int R,int l,int r)
{
    if(L>=l && r>=R) return t[y].sum-t[x].sum;
    else{
        int mid=L+R>>1;
        ll ans=0;
        if(mid>=l) ans+=query(t[x].l,t[y].l,L,mid,l,r);
        if(r>=mid+1) ans+=query(t[x].r,t[y].r,mid+1,R,l,r);
        return ans;
    }
}

int getid(int x){ return lower_bound(v.begin(),v.end(),x)-v.begin()+1; }

int main()
{
    while(~sdd(n,m)){
        forn(i,1,n) sd(a[i]),v.pb(a[i]);
        int flag=0;
        for(int i=1;i<=n;i++) if(a[i]==1) flag=1;
        sort(v.begin(),v.end());
        v.erase(unique(v.begin(),v.end()),v.end());
        forn(i,1,n) a[i]=getid(a[i]);
        ll res=0;
        len=v.size();
        for(int i=1;i<=n;i++) update(root[i],root[i-1],a[i],1,len);
        //for(int i=1;i<=n;i++) dbg(query(root[0],root[4],1,len,getid(a[i]),getid(a[i])));
        for(int i=1;i<=m;i++){
            sdd(x,y);
            // x=min((res+x)%n+1,(res+y)%n+1);
            // y=max((res+x)%n+1,(res+y)%n+1);
            x=(res+x)%n+1;
            y=(res+y)%n+1;
            if(x>y) swap(x,y);
            //dbg(x); dbg(y);
            ll sum=query(root[x-1],root[y],1,len,1,1);
            if(!flag) sum=0;
            else {
                while(true){
                    ll ans=sum+1;
                    int pos=upper_bound(v.begin(),v.end(),ans)-v.begin();
                    if(pos>=len) pos=len;
                    //dbg(v[pos-1]);
                    //dbg(pos);
                    //dbg(query(root[x-1],root[y],1,len,pos,pos));
                    sum=query(root[x-1],root[y],1,len,1,pos);
                    //dbg(sum);
                    if(sum==ans-1) break;
                }
            }
            printf("%lld\n",++sum);
            res=sum;
        }
    }
    //PAUSE;
    return 0;
}

 

已标记关键词 清除标记
相关推荐
©️2020 CSDN 皮肤主题: 酷酷鲨 设计师:CSDN官方博客 返回首页