萌新求助普通莫队
查看原帖
萌新求助普通莫队
521276
张凯_巨大楼主2021/12/30 21:53
#include<iostream>
#include<vector>
#include<cmath>
#include<map>
#include<algorithm>
using namespace std;
#define int long long
int n,q;
int v[100010];
int d[100010];
int ord[100010],orz[100010];
int il,ir;
int s[100010];
int al[100010],ar[100010],ak[100010];
int b;
int bl[100010];
map<int,int> c,dd;
bool cmp(int x,int y)
{
    return d[x]<d[y];
}
bool cmp2(int x,int y)
{
    if(al[x]/b!=al[y]/b)
    {
        return al[x]<al[y];
    }
    return (((al[x]/b)&1) ? (ar[x]<ar[y]) : (ar[x]>ar[y]));
}
vector<int>id[100010],id2[100010];
int ds;
int rc[100010],rd[100010];
signed main()
{
    cin>>n>>q;
    b=sqrt(n);
    for(int i=1;i<=n;i++)
    {
        cin>>v[i];
        if(!c[v[i]])
        {
            dd[v[i]]=++ds;
            id2[ds].push_back(0);
        }
        c[v[i]]++;
        rc[i]=c[v[i]];
        rd[i]=dd[v[i]];
        id[rd[i]].push_back(v[i]*rc[i]);
        d[i]=v[i]*rc[i];
        ord[i]=i;
    }
    sort(ord+1,ord+n+1,cmp);
    for(int i=1;i<=n;i++)
    {
        id2[rd[ord[i]]].push_back(i);
    }
    for(int i=1;i<=q;i++)
    {
        cin>>al[i]>>ar[i];
        orz[i]=i;
    }
    sort(orz+1,orz+q+1,cmp2);
    il=1;
    ir=0;
    for(int k=1;k<=q;k++)
    {
        int tl=al[orz[k]],tr=ar[orz[k]];
        while(tl<il)
        {
            il--;
            s[rd[il]]++;
            bl[id2[rd[il]][s[rd[il]]-1]/b]--;
            bl[id2[rd[il]][s[rd[il]]]/b]++;
        }
        while(ir<tr)
        {
            ir++;
            s[rd[ir]]++;
            bl[id2[rd[ir]][s[rd[ir]]-1]/b]--;
            bl[id2[rd[ir]][s[rd[ir]]]/b]++;
        }
        while(tl>il)
        {
            s[rd[il]]--;
            bl[id2[rd[il]][s[rd[il]]+1]/b]--;
            bl[id2[rd[il]][s[rd[il]]]/b]++;
            il++;
        }
        while(ir>tr)
        {
            s[rd[ir]]--;
            bl[id2[rd[ir]][s[rd[ir]]+1]/b]--;
            bl[id2[rd[ir]][s[rd[ir]]]/b]++;
            ir--;
        }
        for(int i=n/b;i>=0;i--)
        {
            if(bl[i])
            {
                for(int j=i*b+b-1;j>=i*b;j--)
                {
                    //cout<<ord[j]<<' '<<s[rd[ord[j]]]<<' '<<rc[ord[j]]<<endl;
                    if(!rd[ord[j]])
                    {
                        continue;
                    }
                    if(s[rd[ord[j]]]==rc[ord[j]])
                    {
                        ak[orz[k]]=d[ord[j]];
                        break;
                    }
                }
                break;
            }
        }
        //cout<<tl<<' '<<tr<<' '<<ak[orz[k]]<<endl;
    }
    for(int i=1;i<=q;i++)
    {
        cout<<ak[i]<<endl;
    }
    return 0;
}

爆零了(

2021/12/30 21:53
加载中...