#include<bits/stdc++.h>
using namespace std;
#define ll long long 
#define pii pair<int,int>
#define fi first
#define se second
#define el '\n'
const ll maxN = 1e6;
int n, query;
int a[maxN+5];



namespace subtask1
{
    ll C2(int N)
    {
        return (ll) N*(N-1)/2;
    }
    
    ll cal(int L, int R)
    {
        map<int,int> dd;
        int len = R-L+1;
        for(int i=L; i<=R; i++) dd[a[i]]++;
        ll res = 0;
        for(pii c : dd)
        {
            res+= C2(c.se);
        }
        return (ll)(1 + C2(len) - res);
    }
    
    set<pii> seg;
    multiset<ll> val;
    void solve()
    {
        seg.insert({1,n});
        val.insert(cal(1,n));
        while(query--)
        {
            int pos; cin >> pos;
            auto it = seg.upper_bound({pos,(int)1e9});
            it--;
            int L = it -> fi;
            int R = it -> se;
            val.erase(val.find(cal(L,R)));
            seg.erase(it);
            if(L<=pos-1) 
            {
                val.insert(cal(L,pos-1));
                seg.insert({L, pos - 1});
            }
            if(pos+1<=R)
            {
                val.insert(cal(pos+1,R));
                seg.insert({pos+1,R});
            }
            if(val.empty()) cout<<0<<el;
            else cout<<*val.rbegin()<<el;
        }
    }    
}
namespace subtask2
{
    int sz[maxN+5], par[maxN+5], alive[maxN+5];
    int Query[maxN+5];
    ll bad[maxN+5];
    multiset<ll> val;
    unordered_map<int,int> cnt[maxN+5];
    ll ans[maxN+5];

    ll C2(ll N)
    {
        return N*(N-1)/2;
    }

    int findroot(int u)
    {
        if(u == par[u]) return u;
        return par[u] = findroot(par[u]);
    }

    ll cal(int u)
    {
        u = findroot(u);
        return 1LL + C2(sz[u]) - bad[u];
    }

    void add_val(int u)
    {
        u = findroot(u);
        val.insert(cal(u));
    }

    void del_val(int u)
    {
        u = findroot(u);
        val.erase(val.find(cal(u)));
    }

    void dsu(int u, int v)
    {
        u = findroot(u);
        v = findroot(v);

        if(u == v) return;

        if(cnt[u].size() < cnt[v].size())
            swap(u,v);

        del_val(u);
        del_val(v);

        par[v] = u;

        sz[u] += sz[v];

        for(auto f : cnt[v])
        {
            int num = f.fi;
            int sl = f.se;
            bad[u] -= C2(cnt[u][num]);
            cnt[u][num] += sl;
            bad[u] += C2(cnt[u][num]);
        }

        add_val(u);
    }

    void solve()
    {
        
        for(int i=1; i<=n; i++)
        {
            par[i] = i;
            sz[i] = 1;
            alive[i] = 1;
        }

        
        for(int i=1; i<=query; i++)
        {
            cin >> Query[i];
            alive[Query[i]] = 0;
        }

        
        for(int i=1; i<=n; i++)
        {
            if(alive[i])
            {
                cnt[i][a[i]] = 1;
                bad[i] = 0;

                add_val(i);
            }
        }
        for(int i=1; i<n; i++)
        {
            if(alive[i] && alive[i+1])
                dsu(i,i+1);
        }
        for(int i=query; i>=1; i--)
        {
            if(val.empty()) ans[i] = 0;
            else ans[i] = *val.rbegin();
            int u = Query[i];
            alive[u] = 1;
            par[u] = u;
            sz[u] = 1;
            bad[u] = 0;
            cnt[u].clear();
            cnt[u][a[u]] = 1;
            add_val(u);
            if(u > 1 && alive[u-1])
                dsu(u,u-1);
            if(u < n && alive[u+1])
                dsu(u,u+1);
        }
        for(int i=1; i<=query; i++)
            cout << ans[i] << el;
    }
};

int main()
{
    ios_base::sync_with_stdio(0); cin.tie(0);
    freopen("TET.INP","r",stdin);
    freopen("TET.OUT","w",stdout);
    cin >> n >> query;
    for(int i=1; i<=n; i++) cin >> a[i];
    if(n<=5000)subtask1::solve();
    else subtask2::solve();
    return 0;
}
