莫队模板

莫队的模板!!!!!

嘿嘿嘿

#include<bits/stdc++.h>
using namespace std;
const int maxn = 1000005;
inline int read()
{
    int x=0,f=1;char ch=getchar();
    while(ch>'9'||ch<'0'){if(ch=='-')f=-1;ch=getchar();}
    while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();}
    return x*f;
}
int a[maxn],pos[maxn],c[maxn],Ans[maxn];
int ans,n,m;
struct query
{
    int l,r,id;
}Q[maxn];
bool cmp(query a,query b)
{
    if(pos[a.l]==pos[b.l])
        return a.r<b.r;
    return pos[a.l]<pos[b.l];
}
void Update(int x)
{
    c[x]++;
    if(c[x]==2)ans++;
}
void Delete(int x)
{
    c[x]--;
    if(c[x]==1)ans--;
}
int main()
{
    n=read(),m=read(),m=read();
    int sz =ceil(sqrt(1.0*n));
    for(int i=1;i<=n;i++)
    {
        a[i]=read();
        pos[i]=(i-1)/sz;
    }
    for(int i=1;i<=m;i++)
    {
        Q[i].l=read();
        Q[i].r=read();
        Q[i].id = i;
    }
    sort(Q+1,Q+1+m,cmp);
    int L=1,R=0;ans=0;
    for(int i=1;i<=m;i++)
    {
        int id = Q[i].id;
        while(R<Q[i].r)R++,Update(a[R]);
        while(L>Q[i].l)L--,Update(a[L]);
        while(R>Q[i].r)Delete(a[R]),R--;
        while(L<Q[i].l)Delete(a[L]),L++;
        Ans[id]=ans;
    }
    for(int i=1;i<=m;i++)
        printf("%d\n",Ans[i]);
}

你可能感兴趣的:(莫队模板)