求助,分块0分
查看原帖
求助,分块0分
151647
sycqwq楼主2021/11/17 20:05

rt

#include<bits/stdc++.h>
using namespace std;
const int maxn=4e4+5,sqrtn=205;
int n,m,b[maxn],a[maxn],l[maxn],r[maxn],bk[sqrtn][maxn],t,tbk[sqrtn][maxn],sum[sqrtn][maxn];
struct node
{
    int x,id;
}p[sqrtn][sqrtn];
int query(int x,int y)
{
    int tl=lower_bound(l+1,l+t+1,x)-l,tr=upper_bound(r+1,r+t+1,y)-r-1;
    int bk[maxn],tp[maxn];
    node ma=p[tl][tr];
    memset(bk,0,sizeof bk);
    memset(tp,0,sizeof tp);
    if(y-x+1<=t)
    {
        node ma;
        ma.x=ma.id=0;
        for(int i=x;i<=y;i++)
        {
            // cout<<i<<' '<<a[i]<<endl;
            ++bk[a[i]];
            if(bk[a[i]]>ma.x)
            {
                ma.x=bk[a[i]];
                ma.id=a[i];
            }
            if(bk[a[i]]==ma.x)
            {
                ma.id=min(ma.id,a[i]);
            }
        }
        // cout<<"QEFED"<<ma.x<<endl;
        return ma.id;
    }
    for(int i=x;i<l[tl];i++)
    {
        // cout<<i<<' '<<a[i]<<endl;
        ++bk[a[i]];
        if(!tp[a[i]])
        {
            tp[a[i]]=1;
            bk[a[i]]+=sum[tr][a[i]]-sum[tl-1][a[i]];
            if(bk[a[i]]>ma.x)
            {
                ma.x=bk[a[i]];
                ma.id=a[i];
            }
            if(bk[a[i]]==ma.x)
                ma.id=min(ma.id,a[i]);
        }
    }
    for(int i=r[tr]+1;i<=y;i++)
    {
        ++bk[a[i]];
        if(!tp[a[i]])
        {
            tp[a[i]]=1;
            bk[a[i]]+=sum[tr][a[i]]-sum[tl-1][a[i]];
            // ma=max(ma,bk[a[i]]);
            if(bk[a[i]]>ma.x)
            {
                ma.x=bk[a[i]];
                ma.id=a[i];
            }
            if(bk[a[i]]==ma.x)
                ma.id=min(ma.id,a[i]);
        }
    }
    // cout<<"QUQUQUQ"<<ma.x<<endl;
    return ma.id;
}
void yuchuli()
{   
    int bk[maxn];
    for(int i=1;i<=t;i++)
    {
        for(int j=1;j<=n;j++)
        {
            sum[i][j]=sum[i-1][j];
        }
        for(int k=l[i];k<=r[i];k++)
            ++sum[i][a[k]];
    }
    for(int i=1;i<=t;i++)
    {
        memset(bk,0,sizeof bk);
        node tp;
        tp.x=tp.id=0;
        for(int j=i;j<=t;j++)
        {
            for(int k=l[j];k<=r[j];k++)
            {
                ++bk[a[k]];
                if(bk[a[k]]>tp.x)
                {
                    tp.x=bk[a[k]];
                    tp.id=k;
                }
                if(bk[a[k]]==tp.x)
                    tp.id=min(tp.id,a[k]);
            }
            p[i][j]=tp;
        }
    }
}
int tn,tp[maxn];
int main()
{
    // freopen("qaq.in","r",stdin);
    // freopen("my.out","w",stdout);
    cin>>n>>m;
    for(int i=1;i<=n;i++)
    {
        cin>>a[i];
        b[i]=a[i];   
    }
    sort(b+1,b+n+1);
    // cout<<endl;
    tn=unique(b+1,b+n+1)-b-1;
    // for(int i=1;i<=tn;i++)
    //     cout<<b[i]<<' ';
    // cout<<endl;
    for(int i=1;i<=n;i++)
    {
        int k=lower_bound(b+1,b+tn+1,a[i])-b;
        tp[k]=a[i];
        a[i]=k;
        // cout<<a[i]<<endl;
    }
    t=sqrt(n);
    for(int i=1;i<=t;i++)
    {
        l[i]=(i-1)*t+1;
        r[i]=i*t;
    }
    if(r[t]<n)
    {
        ++t;
        l[t]=r[t-1]+1;
        r[t]=n;
    }
    // for(int i=1;i<=t;i++)
    //     cout<<"QWQ"<<l[i]<<" "<<r[i]<<endl;
    yuchuli();
    for(int i=1;i<=t;i++)
    {
        for(int j=l[i];j<=r[i];j++)
            ++bk[i][a[j]];
    }
    int las=0;
    for(int i=1;i<=m;i++)
    {
        int x,y;
        cin>>x>>y;
        x=(x+las-1)%n+1;
        y=(y+las-1)%n+1;
        // cout<<"QWQ"<<x<<' '<<y<<endl;
        if(x>y)
            swap(x,y);
        las=query(x,y);
        las=tp[las];
        cout<<las<<endl;
    }
    return 0;
}
2021/11/17 20:05
加载中...