记录编号 617482 评测结果 AAAAAAAAAA
题目名称 4390.[Ynoi2019 模拟赛] Yuno loves sqrt technology III 最终得分 100
用户昵称 Gravatar2_16鸡扒拌面 是否通过 通过
代码语言 C++ 运行时间 1.479 s
提交时间 2026-07-08 16:58:16 内存使用 17.26 MiB
显示代码纯文本
#include<bits/stdc++.h>
using namespace std;
const int N=5e5+5;
const int B=710;

int n,m,lastans,len;
int a[N],b[N],bel[N],st[B],ed[B];
int f[B][B],sum[N],p[N];
vector<int>pos[N];

int read()
{
    int x=0;char c=getchar();
    while(c<'0'||c>'9')c=getchar();
    while(c>='0'&&c<='9'){x=x*10+c-48;c=getchar();}
    return x;
}

void init()
{
    len=ceil((double)n/B);
    for(int i=1;i<=len;i++){st[i]=ed[i-1]+1;ed[i]=min(i*B,n);}
    for(int i=1;i<=len;i++)
        for(int j=st[i];j<=ed[i];j++)
            bel[j]=i;
    for(int i=1;i<=len;++i)
    {
        for(int j=i;j<=len;++j)
        {
            f[i][j]=f[i][j-1];
            for(int k=st[j];k<=ed[j];k++)
                f[i][j]=max(f[i][j],++sum[a[k]]);
        }
        for(int j=st[i];j<=n;++j)sum[a[j]]=0;
    }
}

int ask(int l,int r)
{
    int bl=bel[l],br=bel[r];
    if(bl==br)
    {
        int res=0;
        for(int i=l;i<=r;++i) res=max(res,++sum[a[i]]);
        for(int i=l;i<=r;++i) sum[a[i]]=0;
        return res;
    }
    int res=f[bl+1][br-1];
    for(int i=l;i<=ed[bl];++i)
    {
        while(res+p[i]<pos[a[i]].size()&&pos[a[i]][res+p[i]]<=r) res++;
    }
    for(int i=st[br];i<=r;++i)
    {
        while(p[i]-res>=0&&pos[a[i]][p[i]-res]>=l) res++;
    }
    return res;
}

int main()
{
    n=read();m=read();
    for(int i=1;i<=n;++i){a[i]=read();b[i]=a[i];}
    sort(b+1,b+n+1);
    int tot=unique(b+1,b+n+1)-b-1;
    for(int i=1;i<=n;++i)
    {
        a[i]=lower_bound(b+1,b+tot+1,a[i])-b;
        pos[a[i]].push_back(i);
        p[i]=pos[a[i]].size()-1;
    }
    init();
    while(m--)
    {
        int l=read(),r=read();
        l^=lastans;r^=lastans;
        if(l>r)swap(l,r);
        lastans=ask(l,r);
        printf("%d\n",lastans);
    }
    return 0;
}