#include <stdlib.h>
#include <stdio.h>
#include <iostream>
#include <algorithm>

using namespace std;

struct dub
{
    int val;
    int rb;
};

struct node
{
    int data;
    node *next;
};

static const int N = 500000;

int tmp[N];
int primes[N];
int num = 0, n;
dub a[N];
node *factor[N];
int Fb[N];
int niz[N];
int in[N];

bool cmp(dub a, dub b)
{
    return (a.val < b.val);
}

void addF(int pos, int p)
{
    node *tmp = new node;
    tmp -> data = p;
    tmp -> next = factor[pos];
    factor[pos] = tmp;
}

int cur;
int br;
int pom;
long long sol = 0;

void track(node *tmp, int k)
{
    if(tmp)
    {
        track(tmp -> next, k);
        cur *= tmp -> data;
        br++;
        track(tmp -> next, k);
        cur /= tmp -> data;
        br--;
    }
    else
    {
        //printf("niz1 %i\n", niz[1]);
        pom += (niz[cur] - k) * (1 - 2 * k) * ((1 - 2 * (br % 2)));
        niz[cur] += (1 - 2 * k);
    }
}

int main()
{
    //freopen("input.in", "r", stdin);
    for(int i = 2; i < 500001; i++)
        if(!tmp[i])
        {
            for(int j = i + i; j < 500001; j += i)
                tmp[j] = 1;
        }
    for(int i = 2; i < 500001; i++)
    {
        if(!tmp[i])
        {
            primes[num] = i;
            num++;
        }
        tmp[i] = 0;
    }
    primes[0] = 2;

    int q;
    scanf("%i", &n);
    scanf("%i", &q);
    for(int i = 0; i < n; i++)
    {
        a[i].rb = i;
        scanf("%i", &a[i].val);
    }

    sort(a, a + n, cmp);

    for(int i = 0; i < n; i++)
        Fb[a[i].rb] = i;

    for(int i = 0; i < n; i++)
    {
        int x = a[i].val;
        for(int j = 0; j < 128; j++)
        {
            if(!(x % primes[j]))
            {
                addF(i, primes[j]);
                while(!(x % primes[j]))
                    x /= primes[j];
            }
        }
        if(x != 1)
        addF(i, x);
    }

    for(int c = 0; c < q; c++)
    {
        int x;
        scanf("%i", &x);
        x--;
        x = Fb[x];
        cur = 1;
        br = 0;
        pom = 0;
        track(factor[x], in[x]);
        in[x] ^= 1;
        sol += pom;
        cout << sol << endl;
    }

    return 0;
}

/*

#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>

using namespace std;

struct node
{
    int data;
    node *next;
};

struct dub
{
    int val;
    int rb;
};

int tmp[500000];
int primes[150000];
int num = 0, n;
dub a[500000];
node *factor[500000];
node *niz[500000];

bool cmp(dub a, dub b)
{
    return (a.val < b.val);
}

void addF(int pos, int p)
{
    node *tmp = new node;
    tmp -> data = p;
    tmp -> next = factor[pos];
    factor[pos] = tmp;
}

int bs(int val)
{
    int l = 0;
    int r = n;
    while(l < r - 1)
    {
        int mid = (l + r) / 2;
        if(a[mid].val <= val)
            l = mid;
        else
            r = mid;
    }
    return l;
}

int nov[500000];
int cnt = 0;
int in[500000];
int Fb[500000];

void add(int val)
{
    if(!tmp[val])
    {
        tmp[val] = 1;
        nov[cnt] = val;
        cnt++;
    }
}

void del()
{
    for(int i = 0; i < cnt; i++)
        tmp[nov[i]] = 0;
    cnt = 0;
}

long long sol = 0;

int main()
{
    //freopen("input.in", "r", stdin);
    for(int i = 2; i < 500001; i++)
        if(!tmp[i])
        {
            for(int j = i + i; j < 500001; j += i)
                tmp[j] = 1;
        }
    for(int i = 2; i < 500001; i++)
    {
        if(!tmp[i])
        {
            primes[num] = i;
            num++;
        }
        tmp[i] = 0;
    }
    primes[0] = 2;

    int q;
    scanf("%i", &n);
    scanf("%i", &q);
    for(int i = 0; i < n; i++)
    {
        a[i].rb = i;
        scanf("%i", &a[i].val);
    }
    sort(a, a + n, cmp);
    for(int i = 0; i < n; i++)
        Fb[a[i].rb] = i;

    for(int i = 0; i < n; i++)
    {
        int x = a[i].val;
        for(int j = 0; j < 128; j++)
        {
            if(!(x % primes[j]))
            {
                addF(i, primes[j]);
                while(!(x % primes[j]))
                    x /= primes[j];
            }
        }
        if(x != 1)
        addF(i, x);
    }

//    for(int i = 0; i < n; i++)
//    {
//        printf("%i:", a[i]);
//        node *tmp = factor[i];
//        while(tmp)
//       {
//            printf(" %i", tmp -> data);
//            tmp = tmp -> next;
//        }
//        printf("\n");
//    }
//
    int broj = 0;
    for(int i = 0; i < q; i++)
    {
        int x;
        scanf("%i", &x);
        //printf(" %i\n", x);
        //x = bs(x);
        int kf = 1;
        x--;
        x = Fb[x];
        if(in[x])
        {
            in[x] = 0;
            kf = -1;
        }
        else
        {
            in[x] = 1;
        }
        broj += kf;
        node *tmp = factor[x];
        //printf("a%i\n", a[x]);
        while(tmp)
        {
            //printf("%i %i\n", x, tmp -> data);
            //printf("ulaz\n");
            //printf("%i:", tmp -> data);
            node *pom = niz[tmp -> data];
            while(pom)
            {
                //printf(" %i,", pom -> data);
                if(pom -> data == x)
                {
                    kf = -1;
                    if(pom -> next)
                    {
                        pom -> data = pom -> next -> data;
                        node *bris = pom -> next;
                        pom -> next = pom -> next -> next;
                        free(bris);
                    }
                    else
                    {
                        //printf("ulazi2\n");
                        node *neo = niz[tmp -> data];
                        if(neo == pom)
                            niz[tmp -> data] = niz[tmp -> data] -> next;
                        else
                        {
                            //printf("Hya\n");
                            while(neo -> next != pom)
                                neo = neo -> next;
                            neo -> next = neo -> next -> next;
                        }
                        //printf("Daym\n");
                        free(pom);
                        pom = NULL;
                        //printf("yeah\n");
                    }
                }
                if(pom)
                {
                    add(pom -> data);
                    pom = pom -> next;
                }
                //printf("wot\n");
            }
            //printf("\n");
            tmp = tmp -> next;
        }

        if(kf == 1)
        {
            node *tmp = factor[x];
            while(tmp)
            {
                node *pom = new node;
                pom -> data = x;
                pom -> next = niz[tmp -> data];
                niz[tmp -> data] = pom;

                tmp = tmp -> next;
            }
        }

     //   for(int i = 0; i < 4; i++)
     //   {
     //       int k = primes[i];
     //       node *tmp = niz[k];
     //       printf("%i:", k);
     //       while(tmp)
     //       {
     //           printf(" %i", tmp -> data);
     //           tmp = tmp -> next;
     //       }
     //       printf("\n");
     //   }
     //   printf("\n");

        sol += kf * ((broj - (1 == kf)) - cnt);
        //printf("%i %i %i\n", broj, cnt, kf);
        cout << sol << endl;
        del();
    }
    return 0;
}
*/


#include <iostream>
#include <stdlib.h>
#include <stdio.h>
#include <algorithm>

using namespace std;

struct node
{
    int data;
    node *next;
};

int tmp[500000];
int primes[150000];
int num = 0, n;
int a[500000];
node *factor[500000];
node *niz[500000];

void addF(int pos, int p)
{
    node *tmp = new node;
    tmp -> data = p;
    tmp -> next = factor[pos];
    factor[pos] = tmp;
}

int bs(int val)
{
    int l = 0;
    int r = n;
    while(l < r - 1)
    {
        int mid = (l + r) / 2;
        if(a[mid] <= val)
            l = mid;
        else
            r = mid;
    }
    return l;
}

int nov[500000];
int cnt = 0;
int in[500000];

void add(int val)
{
    if(!tmp[val])
    {
        tmp[val] = 1;
        nov[cnt] = val;
        cnt++;
    }
}

void del()
{
    for(int i = 0; i < cnt; i++)
        tmp[nov[i]] = 0;
    cnt = 0;
}

long long sol = 0;

int main()
{
    freopen("input.in", "r", stdin);
    for(int i = 2; i < 500001; i++)
        if(!tmp[i])
        {
            for(int j = i + i; j < 500001; j += i)
                tmp[j] = 1;
        }
    for(int i = 2; i < 500001; i++)
    {
        if(!tmp[i])
        {
            primes[num] = i;
            num++;
        }
        tmp[i] = 0;
    }
    primes[0] = 2;

    int q;
    scanf("%i", &n);
    scanf("%i", &q);
    for(int i = 0; i < n; i++)
        scanf("%i", &a[i]);
    sort(a, a + n);

    for(int i = 0; i < n; i++)
    {
        int x = a[i];
        for(int j = 0; j < 128; j++)
        {
            if(!(x % primes[j]))
            {
                addF(i, primes[j]);
                while(!(x % primes[j]))
                    x /= primes[j];
            }
        }
        if(x != 1)
        addF(i, x);
    }
/*
    for(int i = 0; i < n; i++)
    {
        printf("%i:", a[i]);
        node *tmp = factor[i];
        while(tmp)
        {
            printf(" %i", tmp -> data);
            tmp = tmp -> next;
        }
        printf("\n");
    }
*/
    int broj = 0;
    for(int i = 0; i < q; i++)
    {
        int x;
        scanf("%i", &x);
        //printf(" %i\n", x);
        //x = bs(x);
        int kf = 1;
        x--;
        if(in[x])
        {
            in[x] = 0;
            kf = -1;
        }
        else
        {
            in[x] = 1;
        }
        broj += kf;
        node *tmp = factor[x];
        //printf("a%i\n", a[x]);
        while(tmp)
        {
            //printf("ulaz\n");
            //printf("%i:", tmp -> data);
            node *pom = niz[tmp -> data];
            while(pom)
            {
                //printf(" %i,", pom -> data);
                if(pom -> data == x)
                {
                    kf = -1;
                    if(pom -> next)
                    {
                        pom -> data = pom -> next -> data;
                        node *bris = pom -> next;
                        pom -> next = pom -> next -> next;
                        free(bris);
                    }
                    else
                    {
                        //printf("ulazi2\n");
                        node *neo = niz[tmp -> data];
                        if(neo == pom)
                            niz[tmp -> data] = niz[tmp -> data] -> next;
                        else
                        {
                            //printf("Hya\n");
                            while(neo -> next != pom)
                                neo = neo -> next;
                            neo -> next = neo -> next -> next;
                        }
                        //printf("Daym\n");
                        free(pom);
                        pom = NULL;
                        //printf("yeah\n");
                    }
                }
                if(pom)
                {
                    add(pom -> data);
                    pom = pom -> next;
                }
                //printf("wot\n");
            }
            //printf("\n");
            tmp = tmp -> next;
        }

        if(kf == 1)
        {
            node *tmp = factor[x];
            while(tmp)
            {
                node *pom = new node;
                pom -> data = x;
                pom -> next = niz[tmp -> data];
                niz[tmp -> data] = pom;

                tmp = tmp -> next;
            }
        }
        /*
        for(int i = 0; i < 4; i++)
        {
            int k = primes[i];
            node *tmp = niz[k];
            printf("%i:", k);
            while(tmp)
            {
                printf(" %i", tmp -> data);
                tmp = tmp -> next;
            }
            printf("\n");
        }
        printf("\n");
        */
        sol += kf * ((broj - (1 == kf)) - cnt);
        //printf("%i %i %i\n", broj, cnt, kf);
        cout << sol << endl;
        del();
    }
    return 0;
}


#include <bits/stdc++.h>

#define icin(x) scanf("%d",&x)
#define inf 2000000000
using namespace std;

vector<int> primes;
int pc[600009];
void sieve()
{
	for(int i=2;i<=600000;i++)
	{
		if(pc[i]==0)
		{
			primes.push_back(i);

			for(int j=i;j<=600000;j+=i)
				pc[j]=i;

		}
	}
}

#define LL long long

int main()
{
	sieve();
	int n,q;
	icin(n);
	icin(q);
	vector<int> ar(n+1,0),hash(n+1,0),d(600001,0);
	LL ans=0;
	for(int i=1;i<=n;i++)
		icin(ar[i]);
	while(q--)
	{
		int y;
		icin(y);
		hash[y]^=1;
		int x=ar[y];
		vector<int> fac;
		fac.clear();
		int num=x;
		while(num>1)
		{
			//cout << pc[num] << " " <<  num << endl;
			fac.push_back(pc[num]);
			int res=pc[num];
			while(num%res==0)
				num/=res;
		}
		/*for(int i=0;i<primes.size();i++)
		{
			if(primes[i]>x)
				break;
			if(x%primes[i]==0)
				fac.push_back(primes[i]);
		}*/
		int lim = pow(2,fac.size());
		LL change=0;
		//cout << "LIM" << lim << endl;
		change=0;
		for(int i=0;i<lim;i++)
		{
			int good=1;
			int j=i,k;
			k=0;
			int cnt;
			cnt=0;
			while(j)
			{
				if(j&1)
					{	cnt++;
						good*=fac[k];
					}
				j= j>>1;

				k++;
			}

			//cout << "good" << good << endl;
			if(hash[y])
				{
					//cout << cnt << " " << d[good];
					if(cnt%2==0)
					change+=d[good];
				else
					change-=d[good];
					d[good]++;
				}
			else
				{
					d[good]--;
			 		if(cnt%2==0)
					change-=d[good];
					else
					change+=d[good];

			 	}

		}
		ans+=change;

		printf("%I64d\n",ans);
		//cout << ans << endl;

	}

	return 0;
}


#include <bits/stdc++.h>

#define icin(x) scanf("%d",&x)
#define inf 2000000000
using namespace std;

vector<int> primes;
int pc[600009];
void sieve()
{
	for(int i=2;i<=600000;i++)
	{
		if(pc[i]==0)
		{
			primes.push_back(i);

			for(int j=i;j<=600000;j+=i)
				pc[j]=i;

		}
	}
}

int main()
{
	sieve();
	int n,q;
	icin(n);
	icin(q);
	vector<int> ar(n+1,0),hash(q+1,0),d(600001,0);
	int ans=0;
	for(int i=1;i<=n;i++)
		icin(ar[i]);
	while(q--)
	{
		int y;
		icin(y);
		hash[y]^=1;
		int x=ar[y];
		vector<int> fac;
		fac.clear();
		int num=x;
		while(num>1)
		{
			//cout << pc[num] << " " <<  num << endl;
			fac.push_back(pc[num]);
			int res=pc[num];
			while(num%res==0)
				num/=res;
		}
		/*for(int i=0;i<primes.size();i++)
		{
			if(primes[i]>x)
				break;
			if(x%primes[i]==0)
				fac.push_back(primes[i]);
		}*/
		int lim = pow(2,fac.size());
		int change=0;
		//cout << "LIM" << lim << endl;
		change=0;
		for(int i=0;i<lim;i++)
		{
			int good=1;
			int j=i,k;
			k=0;
			int cnt;
			cnt=0;
			while(j)
			{
				if(j&1)
					{	cnt++;
						good*=fac[k];
					}
				j= j>>1;

				k++;
			}

			//cout << "good" << good << endl;
			if(hash[y])
				{
					//cout << cnt << " " << d[good];
					if(cnt%2==0)
					change+=d[good];
				else
					change-=d[good];
					d[good]++;
				}
			else
				{
					d[good]--;
			 		if(cnt%2==0)
					change-=d[good];
					else
					change+=d[good];

			 	}

		}
		ans+=change;
		printf("%d\n",ans);

	}

	return 0;
}


#include <bits/stdc++.h>

#define icin(x) scanf("%d",&x)
#define inf 2000000000
using namespace std;

vector<int> primes;
int pc[600009];
void sieve()
{
	for(int i=2;i<=600000;i++)
	{
		if(pc[i]==0)
		{
			primes.push_back(i);

			for(int j=i;j<=600000;j+=i)
				pc[j]=i;

		}
	}
}

int main()
{
	sieve();
	int n,q;
	icin(n);
	icin(q);
	vector<int> ar(n+1,0),hash(n+1,0),d(600001,0);
	int ans=0;
	for(int i=1;i<=n;i++)
		icin(ar[i]);
	while(q--)
	{
		int y;
		icin(y);
		hash[y]^=1;
		int x=ar[y];
		vector<int> fac;
		fac.clear();
		int num=x;
		while(num>1)
		{
			//cout << pc[num] << " " <<  num << endl;
			fac.push_back(pc[num]);
			int res=pc[num];
			while(num%res==0)
				num/=res;
		}
		/*for(int i=0;i<primes.size();i++)
		{
			if(primes[i]>x)
				break;
			if(x%primes[i]==0)
				fac.push_back(primes[i]);
		}*/
		int lim = pow(2,fac.size());
		int change=0;
		//cout << "LIM" << lim << endl;
		change=0;
		for(int i=0;i<lim;i++)
		{
			int good=1;
			int j=i,k;
			k=0;
			int cnt;
			cnt=0;
			while(j)
			{
				if(j&1)
					{	cnt++;
						good*=fac[k];
					}
				j= j>>1;

				k++;
			}

			//cout << "good" << good << endl;
			if(hash[y])
				{
					//cout << cnt << " " << d[good];
					if(cnt%2==0)
					change+=d[good];
				else
					change-=d[good];
					d[good]++;
				}
			else
				{
					d[good]--;
			 		if(cnt%2==0)
					change-=d[good];
					else
					change+=d[good];

			 	}

		}
		ans+=change;
		cout << ans << endl;

	}

	return 0;
}


#include <bits/stdc++.h>

#define icin(x) scanf("%d",&x)
#define inf 2000000000
using namespace std;

vector<int> primes;
int pc[600009];
void sieve()
{
	for(int i=2;i<=600000;i++)
	{
		if(pc[i]==0)
			primes.push_back(i);
		if(i<=10000)
		{
			for(int j=i*i;j<=600000;j+=i)
				pc[j]=1;
		}
	}
}

int main()
{
	sieve();
	int n,q;
	icin(n);
	icin(q);
	vector<int> ar(n+1,0),hash(q+1,0),d(600001,0);
	int ans=0;
	for(int i=1;i<=n;i++)
		icin(ar[i]);
	while(q--)
	{
		int y;
		icin(y);
		hash[y]^=1;
		int x=ar[y];
		vector<int> fac;
		fac.clear();
		for(int i=0;i<primes.size();i++)
		{
			if(primes[i]>x)
				break;
			if(x%primes[i]==0)
				fac.push_back(primes[i]);
		}
		int lim = pow(2,fac.size());
		int change=0;
		//cout << "LIM" << lim << endl;
		change=0;
		for(int i=0;i<lim;i++)
		{
			int good=1;
			int j=i,k;
			k=0;
			int cnt;
			cnt=0;
			while(j)
			{
				if(j&1)
					{	cnt++;
						good*=fac[k];
					}
				j= j>>1;

				k++;
			}

			//cout << "good" << good << endl;
			if(hash[y])
				{
					//cout << cnt << " " << d[good];
					if(cnt%2==0)
					change+=d[good];
				else
					change-=d[good];
					d[good]++;
				}
			else
				{
					d[good]--;
			 		if(cnt%2==0)
					change-=d[good];
					else
					change+=d[good];

			 	}

		}
		ans+=change;
		printf("%d\n",ans);

	}

	return 0;
}


#include <bits/stdc++.h>

#define icin(x) scanf("%d",&x)
#define inf 2000000000
using namespace std;

vector<int> primes;
int pc[600009];
void sieve()
{
	for(int i=2;i<=600000;i++)
	{
		if(pc[i]==0)
		{
			primes.push_back(i);

			for(int j=i;j<=600000;j+=i)
				pc[j]=i;

		}
	}
}

#define LL long long

int main()
{
	sieve();
	int n,q;
	icin(n);
	icin(q);
	vector<int> ar(n+1,0),hash(n+1,0),d(600001,0);
	LL ans=0;
	for(int i=1;i<=n;i++)
		icin(ar[i]);
	while(q--)
	{
		int y;
		icin(y);
		hash[y]^=1;
		int x=ar[y];
		vector<int> fac;
		fac.clear();
		int num=x;
		while(num>1)
		{
			//cout << pc[num] << " " <<  num << endl;
			fac.push_back(pc[num]);
			int res=pc[num];
			while(num%res==0)
				num/=res;
		}
		/*for(int i=0;i<primes.size();i++)
		{
			if(primes[i]>x)
				break;
			if(x%primes[i]==0)
				fac.push_back(primes[i]);
		}*/
		int lim = pow(2,fac.size());
		LL change=0;
		//cout << "LIM" << lim << endl;
		change=0;
		for(int i=0;i<lim;i++)
		{
			int good=1;
			int j=i,k;
			k=0;
			int cnt;
			cnt=0;
			while(j)
			{
				if(j&1)
					{	cnt++;
						good*=fac[k];
					}
				j= j>>1;

				k++;
			}

			//cout << "good" << good << endl;
			if(hash[y])
				{
					//cout << cnt << " " << d[good];
					if(cnt%2==0)
					change+=d[good];
				else
					change-=d[good];
					d[good]++;
				}
			else
				{
					d[good]--;
			 		if(cnt%2==0)
					change-=d[good];
					else
					change+=d[good];

			 	}

		}
		ans+=change;

		printf("I64d\n",ans);
		//cout << ans << endl;

	}

	return 0;
}


#include <bits/stdc++.h>

#define icin(x) scanf("%d",&x)
#define inf 2000000000
using namespace std;

vector<int> primes;
int pc[100009];
void sieve()
{
	for(int i=2;i<=100000;i++)
	{
		if(pc[i]==0)
			primes.push_back(i);
		if(i<=1000)
		{
			for(int j=i*i;j<=100000;j+=i)
				pc[j]=1;
		}
	}
}

int main()
{
	sieve();
	int n,q;
	icin(n);
	icin(q);
	vector<int> ar(n+1,0),hash(q+1,0),d(100001,0);
	int ans=0;
	for(int i=1;i<=n;i++)
		icin(ar[i]);
	while(q--)
	{
		int y;
		icin(y);
		hash[y]^=1;
		int x=ar[y];
		vector<int> fac;
		fac.clear();
		for(int i=0;i<primes.size();i++)
		{
			if(primes[i]>x)
				break;
			if(x%primes[i]==0)
				fac.push_back(primes[i]);
		}
		int lim = pow(2,fac.size());
		int change=0;
		//cout << "LIM" << lim << endl;
		change=0;
		for(int i=0;i<lim;i++)
		{
			int good=1;
			int j=i,k;
			k=0;
			int cnt;
			cnt=0;
			while(j)
			{
				if(j&1)
					{	cnt++;
						good*=fac[k];
					}
				j= j>>1;

				k++;
			}

			//cout << "good" << good << endl;
			if(hash[y])
				{
					//cout << cnt << " " << d[good];
					if(cnt%2==0)
					change+=d[good];
				else
					change-=d[good];
					d[good]++;
				}
			else
				{
					d[good]--;
			 		if(cnt%2==0)
					change-=d[good];
					else
					change+=d[good];

			 	}

		}
		ans+=change;
		printf("%d\n",ans);

	}

	return 0;
}


#include <bits/stdc++.h>

#define icin(x) scanf("%d",&x)
#define inf 2000000000
using namespace std;

vector<int> primes;
int pc[600009];
void sieve()
{
	for(int i=2;i<=600000;i++)
	{
		if(pc[i]==0)
		{
			primes.push_back(i);

			for(int j=i;j<=600000;j+=i)
				pc[j]=i;

		}
	}
}

#define LL long long

int main()
{
	sieve();
	int n,q;
	icin(n);
	icin(q);
	vector<int> ar(n+1,0),hash(n+1,0),d(600001,0);
	LL ans=0;
	for(int i=1;i<=n;i++)
		icin(ar[i]);
	while(q--)
	{
		int y;
		icin(y);
		hash[y]^=1;
		int x=ar[y];
		vector<int> fac;
		fac.clear();
		int num=x;
		while(num>1)
		{
			//cout << pc[num] << " " <<  num << endl;
			fac.push_back(pc[num]);
			int res=pc[num];
			while(num%res==0)
				num/=res;
		}
		/*for(int i=0;i<primes.size();i++)
		{
			if(primes[i]>x)
				break;
			if(x%primes[i]==0)
				fac.push_back(primes[i]);
		}*/
		int lim = pow(2,fac.size());
		LL change=0;
		//cout << "LIM" << lim << endl;
		change=0;
		for(int i=0;i<lim;i++)
		{
			int good=1;
			int j=i,k;
			k=0;
			int cnt;
			cnt=0;
			while(j)
			{
				if(j&1)
					{	cnt++;
						good*=fac[k];
					}
				j= j>>1;

				k++;
			}

			//cout << "good" << good << endl;
			if(hash[y])
				{
					//cout << cnt << " " << d[good];
					if(cnt%2==0)
					change+=d[good];
				else
					change-=d[good];
					d[good]++;
				}
			else
				{
					d[good]--;
			 		if(cnt%2==0)
					change-=d[good];
					else
					change+=d[good];

			 	}

		}
		ans+=change;
		cout << ans << endl;

	}

	return 0;
}


#include <bits/stdc++.h>

#define icin(x) scanf("%d",&x)
#define inf 2000000000
using namespace std;

vector<int> primes;
int pc[600009];
void sieve()
{
	for(int i=2;i<=600000;i++)
	{
		if(pc[i]==0)
		{
			primes.push_back(i);

			for(int j=i;j<=600000;j+=i)
				pc[j]=i;

		}
	}
}

int main()
{
	sieve();
	int n,q;
	icin(n);
	icin(q);
	vector<int> ar(n+1,0),hash(q+1,0),d(600001,0);
	int ans=0;
	for(int i=1;i<=n;i++)
		icin(ar[i]);
	while(q--)
	{
		int y;
		icin(y);
		hash[y]^=1;
		int x=ar[y];
		vector<int> fac;
		fac.clear();
		int num=x;
		while(num>1)
		{
			//cout << pc[num] << " " <<  num << endl;
			fac.push_back(pc[num]);
			int res=pc[num];
			while(num%res==0)
				num/=res;
		}
		/*for(int i=0;i<primes.size();i++)
		{
			if(primes[i]>x)
				break;
			if(x%primes[i]==0)
				fac.push_back(primes[i]);
		}*/
		int lim = pow(2,fac.size());
		int change=0;
		//cout << "LIM" << lim << endl;
		change=0;
		for(int i=0;i<lim;i++)
		{
			int good=1;
			int j=i,k;
			k=0;
			int cnt;
			cnt=0;
			while(j)
			{
				if(j&1)
					{	cnt++;
						good*=fac[k];
					}
				j= j>>1;

				k++;
			}

			//cout << "good" << good << endl;
			if(hash[y])
				{
					//cout << cnt << " " << d[good];
					if(cnt%2==0)
					change+=d[good];
				else
					change-=d[good];
					d[good]++;
				}
			else
				{
					d[good]--;
			 		if(cnt%2==0)
					change-=d[good];
					else
					change+=d[good];

			 	}

		}
		ans+=change;
		cout << ans << endl;

	}

	return 0;
}


#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN=200010,MAXA=500000;
int n,q,ans;
int a[MAXN],f[MAXA+10],cnt[MAXA+10];
bool check[MAXA+10],exi[MAXN];
int total;
int d[MAXA+10][10],divisor[MAXA+10];
void divide()
{
	for (int i=2;i<=MAXA;i++)
		if (d[i][0]==0)
			for (int j=i;j<=MAXA;j+=i)
				d[j][++d[j][0]]=i;
	return ;
}
void delbuild(int k,int i,int now,int m)
{
	if (i>m) {
		if (now==1) return ;
		ans+=divisor[now];
		return ; }
	delbuild(k,i+1,now,m);
	delbuild(k,i+1,now*d[k][i],m);
	return ;
}
void del(int k)
{
	ans-=total;
	delbuild(k,1,1,d[k][0]);
	cnt[k]--;
	for (int i=1;i<=d[k][0];i++)
		divisor[d[k][i]]--;
	return ;
}
void addbuild(int k,int i,int now,int m)
{
	if (i>m) {
		if (now==1) return ;
		ans-=divisor[now];
		return ; }
	addbuild(k,i+1,now,m);
	addbuild(k,i+1,now*d[k][i],m);
	return ;
}
void add(int k)
{
	ans+=total;
	addbuild(k,1,1,d[k][0]);
	for (int i=1;i<=d[k][0];i++)
		divisor[d[k][i]]++;
	cnt[k]++;
	return ;
}
void init()
{
	cin>>n>>q;
	divide();
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for (int x,i=1;i<=q;i++) {
		scanf("%d",&x);
		if (!exi[x]) { exi[x]=true; add(a[x]); total++; }
		else { exi[x]=false; total--; del(a[x]); }
		printf("%d\n",ans); }
	return ;
}
int main()
{
	init();
	return 0;
}


#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
typedef long long ull;
const int MAXN=200010,MAXA=500000;
int n,q;
ull ans;
int a[MAXN];
bool check[MAXA+10],exi[MAXN];
ull d[MAXA+10][10],divisor[MAXA+10];
void divide()
{
	for (int i=2;i<=MAXA;i++)
		if (d[i][0]==0)
			for (int j=i;j<=MAXA;j+=i)
				d[j][++d[j][0]]=i;
	return ;
}
void delbuild(int k,int i,int now,int m,int mobi)
{
	if (i>m) {
		divisor[now]--;
		ans+=divisor[now]*mobi;
		return ; }
	delbuild(k,i+1,now,m,mobi);
	delbuild(k,i+1,now*d[k][i],m,mobi*-1);
	return ;
}
void del(int k)
{
	delbuild(k,1,1,d[k][0],-1);
	return ;
}
void addbuild(int k,int i,int now,int m,int mobi)
{
	if (i>m) {
		ans+=divisor[now]*mobi;
		divisor[now]++;
		return ; }
	addbuild(k,i+1,now,m,mobi);
	addbuild(k,i+1,now*d[k][i],m,mobi*-1);
	return ;
}
void add(int k)
{
	addbuild(k,1,1,d[k][0],1);
	return ;
}
void init()
{
	cin>>n>>q;
	divide();
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for (int x,i=1;i<=q;i++) {
		scanf("%d",&x);
		if (!exi[x]) { exi[x]=true; add(a[x]); }
		else { exi[x]=false; del(a[x]); }
		printf("%I64d\n",ans); }
	return ;
}
int main()
{
	init();
	return 0;
}


#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN=200010,MAXA=500000;
int n,q,ans,one;
int a[MAXN],f[MAXA+10],cnt[MAXA+10];
bool check[MAXA+10],exi[MAXN];
int total;
int d[MAXA+10][10],divisor[MAXA+10];
void divide()
{
	for (int i=2;i<=MAXA;i++)
		if (d[i][0]==0)
			for (int j=i;j<=MAXA;j+=i)
				d[j][++d[j][0]]=i;
	return ;
}
void delbuild(int k,int i,int now,int m,int mobi)
{
	if (i>m) {
		divisor[now]--;
		ans+=divisor[now]*mobi;
		return ; }
	delbuild(k,i+1,now,m,mobi);
	delbuild(k,i+1,now*d[k][i],m,mobi*-1);
	return ;
}
void del(int k)
{
	delbuild(k,1,1,d[k][0],-1);
	return ;
}
void addbuild(int k,int i,int now,int m,int mobi)
{
	if (i>m) {
		ans+=divisor[now]*mobi;
		divisor[now]++;
		return ; }
	addbuild(k,i+1,now,m,mobi);
	addbuild(k,i+1,now*d[k][i],m,mobi*-1);
	return ;
}
void add(int k)
{
	addbuild(k,1,1,d[k][0],1);
	return ;
}
void init()
{
	cin>>n>>q;
	divide();
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for (int x,i=1;i<=q;i++) {
		scanf("%d",&x);
		if (!exi[x]) { exi[x]=true; add(a[x]); total++; }
		else { exi[x]=false; total--; del(a[x]); }
		printf("%d\n",ans); }
	return ;
}
int main()
{
	init();
	return 0;
}


#include <cstring>
#include <cmath>
#include <cstdio>
#include <cstdlib>
#include <iostream>
#include <algorithm>
using namespace std;
const int MAXN=200010,MAXA=500000;
int n,q,ans;
int a[MAXN],f[MAXA+10],cnt[MAXA+10];
bool check[MAXA+10],exi[MAXN];
int total;
int d[MAXA+10][10],divisor[MAXA+10];
void divide()
{
	for (int i=2;i<=MAXA;i++)
		if (d[i][0]==0)
			for (int j=i;j<=MAXA;j+=i)
				d[j][++d[j][0]]=i;
	return ;
}
void delbuild(int k,int i,int now,int m)
{
	if (i>m) {
		ans+=divisor[now];
		return ; }
	delbuild(k,i+1,now,m);
	delbuild(k,i+1,now*d[k][i],m);
	return ;
}
void del(int k)
{
	ans-=total;
	delbuild(k,1,1,d[k][0]);
	cnt[k]--;
	for (int i=1;i<=d[k][0];i++)
		divisor[d[k][i]]--;
	return ;
}
void addbuild(int k,int i,int now,int m)
{
	if (i>m) {
		if (now==1) return ;
		ans-=divisor[now];
		return ; }
	addbuild(k,i+1,now,m);
	addbuild(k,i+1,now*d[k][i],m);
	return ;
}
void add(int k)
{
	ans+=total;
	addbuild(k,1,1,d[k][0]);
	for (int i=1;i<=d[k][0];i++)
		divisor[d[k][i]]++;
	cnt[k]++;
	return ;
}
void init()
{
	cin>>n>>q;
	divide();
	for (int i=1;i<=n;i++)
		scanf("%d",&a[i]);
	for (int x,i=1;i<=q;i++) {
		scanf("%d",&x);
		if (!exi[x]) { exi[x]=true; add(a[x]); total++; }
		else { exi[x]=false; total--; del(a[x]); }
		printf("%d\n",ans); }
	return ;
}
int main()
{
	init();
	return 0;
}


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>

#define f first
#define s second
#define pb push_back
#define FOR(i,a,b) for(i = (a);i < (b);i++)

using namespace std;

typedef long long int ll;
typedef pair<int,int> pr;

vector<int> Div[500005];
bool isprime[500005];
int prime[50005];
int arr[500005];
int A[500005],Used[500005];
int M[500005];

int n,q;
ll ans,tot,one;

#define gc getchar_unlocked

void scanint(int &x)
{
    register int c = gc();
    x = 0;
    for(;(c<48 || c>57);c = gc());
    for(;c>47 && c<58;c = gc()) {x = (x<<1) + (x<<3) + c - 48;}
}

void precomp()
{
	int i,j,mx,cnt,val,key,k,sz;

	mx = 0;
	FOR(i,1,n+1)
	{
		scanint(A[i]);
		Used[i] = 0;
		mx = max(mx,A[i]);
	}

	memset(isprime,true,sizeof(isprime));

	for(i = 2;i*i <= mx;i++)
	{
		if(isprime[i])
		for(j = i*i;j <= mx;j = j+i)
			isprime[j] = false;
	}

	cnt = 0;
	FOR(i,2,mx+1)
	{
		if(isprime[i])
			prime[cnt++] = i;
	}

	FOR(i,1,n+1)
	{
		if(A[i] == 1)
			continue;
		val = A[i];
		if(!M[A[i]])
		{
		FOR(j,0,cnt)
		{
			key = 0;
			while((val%prime[j]) == 0)
			{
				val = val/prime[j];
				key = 1;
			}
			if(key == 1)
				Div[i].pb(prime[j]);
			if(val == 1)
				break;
		}
		if(val > 1)
			Div[i].pb(val);
		M[A[i]] = i;
		}
		else
		{
			k = M[A[i]];
			sz = Div[k].size();
			for(j = 0;j < sz;j++)
			{
				Div[i].pb(Div[k][j]);
			}
		}

	}
}

void func(int a)
{
	int sz,sz1,i,y,cnt,val,j;

	if(Used[a] == 1)
	{
		if(A[a] == 1)
		{
			ans += tot;
			one++;
		}
		else
		{
			sz = Div[a].size();
			sz1 = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y  = y*2;
				}
				if(cnt&1)
				{
					ans -= arr[val];
					arr[val]++;
				}
				else
				{
					ans += arr[val];
					arr[val]++;
				}
			}

			ans += tot;
		}
		tot++;

	}
	else
	{
		tot--;
		if(A[a] == 1)
		{
			ans -= tot;
			one--;
		}
		else
		{
			sz = Div[a].size();
			sz1  = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y = y*2;
				}
				if(cnt&1)
				{
					arr[val]--;

					//cout<<val<<" "<<arr[val]<<" val is\n";
					ans += arr[val];
				}
				else
				{
					arr[val]--;
					//cout<<val<<" "<<arr[val]<<" val is \n";
					ans -= arr[val];
				}
			}
			ans -= tot;
		}
	}

	cout<<ans<<endl;

}

int main()
{

	int mx,i,a,sz,j;

	scanint(n);
	scanint(q);

	mx = 0;
	precomp();
	/*FOR(i,1,n+1)
	{
		sz = Div[i].size();
		FOR(j,0,sz)
			cout<<Div[i][j]<<" ";
		cout<<endl;
	}*/

	//exit(0);

	FOR(i,1,q+1)
	{
		scanint(a);
		Used[a] = (Used[a] == 1)?0:1;
		func(a);
	}

	return 0;
}


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>

#define f first
#define s second
#define pb push_back
#define FOR(i,a,b) for(i = (a);i < (b);i++)

using namespace std;

typedef long long int ll;
typedef pair<int,int> pr;

vector<int> Div[500005];
bool isprime[500005];
int prime[50005];
int arr[500005];
int A[500005],Used[500005];

int n,q;
ll ans,tot,one;

void precomp()
{
	int i,j,mx,cnt,val,key;

	mx = 0;
	FOR(i,1,n+1)
	{
		scanf("%d",&A[i]);
		Used[i] = 0;
		mx = max(mx,A[i]);
	}

	memset(isprime,true,sizeof(isprime));

	for(i = 2;i*i <= mx;i++)
	{
		if(isprime[i])
		for(j = i*i;j <= mx;j = j+i)
			isprime[j] = false;
	}

	cnt = 0;
	FOR(i,2,mx+1)
	{
		if(isprime[i])
			prime[cnt++] = i;
	}

	FOR(i,1,n+1)
	{
		if(A[i] == 1)
			continue;
		val = A[i];
		FOR(j,0,cnt)
		{
			key = 0;
			while((val%prime[j]) == 0)
			{
				val = val/prime[j];
				key = 1;
			}
			if(key == 1)
				Div[i].pb(prime[j]);
			if(val == 1)
				break;
		}
		if(val > 1)
			Div[i].pb(val);

	}
}

void func(int a)
{
	int sz,sz1,i,y,cnt,val,j;

	if(Used[a] == 1)
	{
		if(A[a] == 1)
		{
			ans += tot;
			one++;
		}
		else
		{
			sz = Div[a].size();
			sz1 = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y  = y*2;
				}
				if(cnt&1)
				{
					ans -= arr[val];
					arr[val]++;
				}
				else
				{
					ans += arr[val];
					arr[val]++;
				}
			}

			ans += tot;
		}
		tot++;

	}
	else
	{
		tot--;
		if(A[a] == 1)
		{
			ans -= tot;
			one--;
		}
		else
		{
			sz = Div[a].size();
			sz1  = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&1)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y = y*2;
				}
				if(cnt&1)
				{
					arr[val]--;
					ans += arr[val];
				}
				else
				{
					arr[val]--;
					ans -= arr[val];
				}
			}
			ans -= tot;
		}
	}
	cout<<ans<<endl;

}

int main()
{

	int mx,i,a,sz,j;

	scanf("%d %d",&n,&q);

	mx = 0;
	precomp();
	/*FOR(i,1,n+1)
	{
		sz = Div[i].size();
		FOR(j,0,sz)
			cout<<Div[i][j]<<" ";
		cout<<endl;
	}*/

	//exit(0);

	FOR(i,1,q+1)
	{
		scanf("%d",&a);
		Used[a] = (Used[a] == 1)?0:1;
		func(a);
	}

	return 0;
}


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>

#define f first
#define s second
#define pb push_back
#define FOR(i,a,b) for(i = (a);i < (b);i++)
#define scanint(val) cin>>val

using namespace std;

typedef long long int ll;
typedef pair<int,int> pr;

vector<int> Div[500005];
bool isprime[500005];
int prime[50005];
int arr[500005];
int A[500005],Used[500005];
int M[500005];

int n,q;
int tot;
ll ans;

#define gc getchar_unlocked

void precomp()
{
	int i,j,mx,cnt,val,key,k,sz;

	mx = 0;
	FOR(i,1,n+1)
	{
		scanint(A[i]);
		Used[i] = 0;
		mx = max(mx,A[i]);
	}

	memset(isprime,true,sizeof(isprime));

	for(i = 2;i*i <= mx;i++)
	{
		if(isprime[i])
		for(j = i*i;j <= mx;j = j+i)
			isprime[j] = false;
	}

	cnt = 0;
	FOR(i,2,mx+1)
	{
		if(isprime[i])
			prime[cnt++] = i;
	}

	FOR(i,1,n+1)
	{
		if(A[i] == 1)
			continue;
		val = A[i];
		if(!M[A[i]])
		{
		FOR(j,0,cnt)
		{
			key = 0;
			while((val%prime[j]) == 0)
			{
				val = val/prime[j];
				key = 1;
			}
			if(key == 1)
				Div[i].pb(prime[j]);
			if(val == 1)
				break;
		}
		if(val > 1)
			Div[i].pb(val);
		M[A[i]] = i;
		}
		else
		{
			k = M[A[i]];
			sz = Div[k].size();
			for(j = 0;j < sz;j++)
			{
				Div[i].pb(Div[k][j]);
			}
		}

	}
}

void func(int a)
{
	int sz,sz1,i,y,cnt,val,j;

	if(Used[a] == 1)
	{
		if(A[a] == 1)
		{
			ans += tot;
		}
		else
		{
			sz = Div[a].size();
			sz1 = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y  = y*2;
				}
				if(cnt&1)
				{
					ans -= arr[val];
					arr[val]++;
				}
				else
				{
					ans += arr[val];
					arr[val]++;
				}
			}

			ans += tot;
		}
		tot++;

	}
	else
	{
		tot--;
		if(A[a] == 1)
		{
			ans -= tot;
		}
		else
		{
			sz = Div[a].size();
			sz1  = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y = y*2;
				}
				if(cnt&1)
				{
					arr[val]--;

					//cout<<val<<" "<<arr[val]<<" val is\n";
					ans += arr[val];
				}
				else
				{
					arr[val]--;
					//cout<<val<<" "<<arr[val]<<" val is \n";
					ans -= arr[val];
				}
			}
			ans -= tot;
		}
	}

	cout<<ans<<"\n";

}

int main()
{

	int mx,i,a,sz,j;
	ios::sync_with_stdio(false);

	scanint(n);
	scanint(q);

	mx = 0;
	precomp();
	/*FOR(i,1,n+1)
	{
		sz = Div[i].size();
		FOR(j,0,sz)
			cout<<Div[i][j]<<" ";
		cout<<endl;
	}*/

	//exit(0);

	FOR(i,1,q+1)
	{
		scanint(a);
		Used[a] = (Used[a] == 1)?0:1;
		func(a);
	}

	return 0;
}


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>
#include<cmath>

#define f first
#define s second
#define pb push_back
#define FOR(i,a,b) for(i = (a);i < (b);i++)
#define scanint(val) cin>>val

using namespace std;

typedef long long int ll;
typedef pair<int,int> pr;

vector<int> Div[500005];
bool isprime[500005];
int prime[50005];
int arr[500005];
int A[500005],Used[500005];
int M[500005];

int n,q;
int tot;
ll ans;

#define gc getchar_unlocked

void precomp()
{
	int i,j,mx,cnt,val,key,k,sz;

	mx = 0;
	FOR(i,1,n+1)
	{
		scanint(A[i]);
		Used[i] = 0;
		mx = max(mx,A[i]);
	}

	memset(isprime,true,sizeof(isprime));

	mx = sqrt(mx);
	for(i = 2;i*i <= mx;i++)
	{
		if(isprime[i])
		for(j = i*i;j <= mx;j = j+i)
			isprime[j] = false;
	}

	cnt = 0;
	FOR(i,2,mx+1)
	{
		if(isprime[i])
			prime[cnt++] = i;
	}

	FOR(i,1,n+1)
	{
		if(A[i] == 1)
			continue;
		val = A[i];
		if(!M[A[i]])
		{
		FOR(j,0,cnt)
		{
			key = 0;
			while((val%prime[j]) == 0)
			{
				val = val/prime[j];
				key = 1;
			}
			if(key == 1)
				Div[i].pb(prime[j]);
			if(val == 1)
				break;
		}
		if(val > 1)
			Div[i].pb(val);
		M[A[i]] = i;
		}
		else
		{
			k = M[A[i]];
			Div[i] = Div[k];
			/*for(j = 0;j < sz;j++)
			{
				Div[i].pb(Div[k][j]);
			}*/
		}

	}
}

void func(int a)
{
	int sz,sz1,i,y,cnt,val,j;

	if(Used[a] == 1)
	{
		if(A[a] == 1)
		{
			ans += tot;
		}
		else
		{
			sz = Div[a].size();
			sz1 = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y  = y*2;
				}
				if(cnt&1)
				{
					ans -= arr[val];
					arr[val]++;
				}
				else
				{
					ans += arr[val];
					arr[val]++;
				}
			}

			ans += tot;
		}
		tot++;

	}
	else
	{
		tot--;
		if(A[a] == 1)
		{
			ans -= tot;
		}
		else
		{
			sz = Div[a].size();
			sz1  = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y = y*2;
				}
				if(cnt&1)
				{
					arr[val]--;

					//cout<<val<<" "<<arr[val]<<" val is\n";
					ans += arr[val];
				}
				else
				{
					arr[val]--;
					//cout<<val<<" "<<arr[val]<<" val is \n";
					ans -= arr[val];
				}
			}
			ans -= tot;
		}
	}

	cout<<ans<<"\n";

}

int main()
{

	int mx,i,a,sz,j;
	ios::sync_with_stdio(false);

	scanint(n);
	scanint(q);

	mx = 0;
	precomp();
	/*FOR(i,1,n+1)
	{
		sz = Div[i].size();
		FOR(j,0,sz)
			cout<<Div[i][j]<<" ";
		cout<<endl;
	}*/

	//exit(0);

	FOR(i,1,q+1)
	{
		scanint(a);
		Used[a] = (Used[a] == 1)?0:1;
		func(a);
	}

	return 0;
}


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>

#define f first
#define s second
#define pb push_back
#define FOR(i,a,b) for(i = (a);i < (b);i++)
#define scanint(val) cin>>val

using namespace std;

typedef long long int ll;
typedef pair<int,int> pr;

vector<int> Div[500005];
bool isprime[500005];
int prime[50005];
int arr[500005];
int A[500005],Used[500005];
int M[500005];

int n,q;
int tot;
ll ans;

#define gc getchar_unlocked

void precomp()
{
	int i,j,mx,cnt,val,key,k,sz;

	mx = 0;
	FOR(i,1,n+1)
	{
		scanint(A[i]);
		Used[i] = 0;
		mx = max(mx,A[i]);
	}

	memset(isprime,true,sizeof(isprime));

	for(i = 2;i*i <= mx;i++)
	{
		if(isprime[i])
		for(j = i*i;j <= mx;j = j+i)
			isprime[j] = false;
	}

	cnt = 0;
	FOR(i,2,mx+1)
	{
		if(isprime[i])
			prime[cnt++] = i;
	}

	FOR(i,1,n+1)
	{
		if(A[i] == 1)
			continue;
		val = A[i];
		if(!M[A[i]])
		{
		FOR(j,0,cnt)
		{
			key = 0;
			while((val%prime[j]) == 0)
			{
				val = val/prime[j];
				key = 1;
			}
			if(key == 1)
				Div[i].pb(prime[j]);
			if(val == 1)
				break;
		}
		if(val > 1)
			Div[i].pb(val);
		M[A[i]] = i;
		}
		else
		{
			k = M[A[i]];
			Div[i] = Div[k];
			/*for(j = 0;j < sz;j++)
			{
				Div[i].pb(Div[k][j]);
			}*/
		}

	}
}

void func(int a)
{
	int sz,sz1,i,y,cnt,val,j;

	if(Used[a] == 1)
	{
		if(A[a] == 1)
		{
			ans += tot;
		}
		else
		{
			sz = Div[a].size();
			sz1 = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y  = y*2;
				}
				if(cnt&1)
				{
					ans -= arr[val];
					arr[val]++;
				}
				else
				{
					ans += arr[val];
					arr[val]++;
				}
			}

			ans += tot;
		}
		tot++;

	}
	else
	{
		tot--;
		if(A[a] == 1)
		{
			ans -= tot;
		}
		else
		{
			sz = Div[a].size();
			sz1  = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y = y*2;
				}
				if(cnt&1)
				{
					arr[val]--;

					//cout<<val<<" "<<arr[val]<<" val is\n";
					ans += arr[val];
				}
				else
				{
					arr[val]--;
					//cout<<val<<" "<<arr[val]<<" val is \n";
					ans -= arr[val];
				}
			}
			ans -= tot;
		}
	}

	cout<<ans<<"\n";

}

int main()
{

	int mx,i,a,sz,j;
	ios::sync_with_stdio(false);

	scanint(n);
	scanint(q);

	mx = 0;
	precomp();
	/*FOR(i,1,n+1)
	{
		sz = Div[i].size();
		FOR(j,0,sz)
			cout<<Div[i][j]<<" ";
		cout<<endl;
	}*/

	//exit(0);

	FOR(i,1,q+1)
	{
		scanint(a);
		Used[a] = (Used[a] == 1)?0:1;
		func(a);
	}

	return 0;
}


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>

#define f first
#define s second
#define pb push_back
#define FOR(i,a,b) for(i = (a);i < (b);i++)
#define scanint(val) scanf("%d",&val)

using namespace std;

typedef long long int ll;
typedef pair<int,int> pr;

vector<int> Div[500005];
bool isprime[500005];
int prime[50005];
int arr[500005];
int A[500005],Used[500005];
int M[500005];

int n,q;
int ans,tot,one;

#define gc getchar_unlocked

void precomp()
{
	int i,j,mx,cnt,val,key,k,sz;

	mx = 0;
	FOR(i,1,n+1)
	{
		scanint(A[i]);
		Used[i] = 0;
		mx = max(mx,A[i]);
	}

	memset(isprime,true,sizeof(isprime));

	for(i = 2;i*i <= mx;i++)
	{
		if(isprime[i])
		for(j = i*i;j <= mx;j = j+i)
			isprime[j] = false;
	}

	cnt = 0;
	FOR(i,2,mx+1)
	{
		if(isprime[i])
			prime[cnt++] = i;
	}

	FOR(i,1,n+1)
	{
		if(A[i] == 1)
			continue;
		val = A[i];
		if(!M[A[i]])
		{
		FOR(j,0,cnt)
		{
			key = 0;
			while((val%prime[j]) == 0)
			{
				val = val/prime[j];
				key = 1;
			}
			if(key == 1)
				Div[i].pb(prime[j]);
			if(val == 1)
				break;
		}
		if(val > 1)
			Div[i].pb(val);
		M[A[i]] = i;
		}
		else
		{
			k = M[A[i]];
			sz = Div[k].size();
			for(j = 0;j < sz;j++)
			{
				Div[i].pb(Div[k][j]);
			}
		}

	}
}

void func(int a)
{
	int sz,sz1,i,y,cnt,val,j;

	if(Used[a] == 1)
	{
		if(A[a] == 1)
		{
			ans += tot;
		}
		else
		{
			sz = Div[a].size();
			sz1 = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y  = y*2;
				}
				if(cnt&1)
				{
					ans -= arr[val];
					arr[val]++;
				}
				else
				{
					ans += arr[val];
					arr[val]++;
				}
			}

			ans += tot;
		}
		tot++;

	}
	else
	{
		tot--;
		if(A[a] == 1)
		{
			ans -= tot;
		}
		else
		{
			sz = Div[a].size();
			sz1  = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y = y*2;
				}
				if(cnt&1)
				{
					arr[val]--;

					//cout<<val<<" "<<arr[val]<<" val is\n";
					ans += arr[val];
				}
				else
				{
					arr[val]--;
					//cout<<val<<" "<<arr[val]<<" val is \n";
					ans -= arr[val];
				}
			}
			ans -= tot;
		}
	}

	printf("%d\n",ans);

}

int main()
{

	int mx,i,a,sz,j;

	scanint(n);
	scanint(q);

	mx = 0;
	precomp();
	/*FOR(i,1,n+1)
	{
		sz = Div[i].size();
		FOR(j,0,sz)
			cout<<Div[i][j]<<" ";
		cout<<endl;
	}*/

	//exit(0);

	FOR(i,1,q+1)
	{
		scanint(a);
		Used[a] = (Used[a] == 1)?0:1;
		func(a);
	}

	return 0;
}


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>

#define f first
#define s second
#define pb push_back
#define FOR(i,a,b) for(i = (a);i < (b);i++)

using namespace std;

typedef long long int ll;
typedef pair<int,int> pr;

vector<int> Div[500005];
bool isprime[500005];
int prime[50005];
int arr[500005];
int A[500005],Used[500005];

int n,q;
ll ans,tot,one;

void precomp()
{
	int i,j,mx,cnt,val,key;

	mx = 0;
	FOR(i,1,n+1)
	{
		scanf("%d",&A[i]);
		Used[i] = 0;
		mx = max(mx,A[i]);
	}

	memset(isprime,true,sizeof(isprime));

	for(i = 2;i*i <= mx;i++)
	{
		if(isprime[i])
		for(j = i*i;j <= mx;j = j+i)
			isprime[j] = false;
	}

	cnt = 0;
	FOR(i,2,mx+1)
	{
		if(isprime[i])
			prime[cnt++] = i;
	}

	FOR(i,1,n+1)
	{
		if(A[i] == 1)
			continue;
		val = A[i];
		FOR(j,0,cnt)
		{
			key = 0;
			while((val%prime[j]) == 0)
			{
				val = val/prime[j];
				key = 1;
			}
			if(key == 1)
				Div[i].pb(prime[j]);
			if(val == 1)
				break;
		}
		if(val > 1)
			Div[i].pb(val);

	}
}

void func(int a)
{
	int sz,sz1,i,y,cnt,val,j;

	if(Used[a] == 1)
	{
		if(A[a] == 1)
		{
			ans += tot;
			one++;
		}
		else
		{
			sz = Div[a].size();
			sz1 = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y  = y*2;
				}
				if(cnt&1)
				{
					ans -= arr[val];
					arr[val]++;
				}
				else
				{
					ans += arr[val];
					arr[val]++;
				}
			}

			ans += tot;
		}
		tot++;

	}
	else
	{
		tot--;
		if(A[a] == 1)
		{
			ans -= tot;
			one--;
		}
		else
		{
			sz = Div[a].size();
			sz1  = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y = y*2;
				}
				if(cnt&1)
				{
					arr[val]--;

					//cout<<val<<" "<<arr[val]<<" val is\n";
					ans += arr[val];
				}
				else
				{
					arr[val]--;
					//cout<<val<<" "<<arr[val]<<" val is \n";
					ans -= arr[val];
				}
			}
			ans -= tot;
		}
	}

	cout<<ans<<endl;

}

int main()
{

	int mx,i,a,sz,j;

	scanf("%d %d",&n,&q);

	mx = 0;
	precomp();
	/*FOR(i,1,n+1)
	{
		sz = Div[i].size();
		FOR(j,0,sz)
			cout<<Div[i][j]<<" ";
		cout<<endl;
	}*/

	//exit(0);

	FOR(i,1,q+1)
	{
		scanf("%d",&a);
		Used[a] = (Used[a] == 1)?0:1;
		func(a);
	}

	return 0;
}


#include<iostream>
#include<cstdio>
#include<cstdlib>
#include<string>
#include<cstring>
#include<algorithm>
#include<vector>

#define f first
#define s second
#define pb push_back
#define FOR(i,a,b) for(i = (a);i < (b);i++)

using namespace std;

typedef long long int ll;
typedef pair<int,int> pr;

vector<int> Div[500005];
bool isprime[500005];
int prime[50005];
int arr[500005];
int A[500005],Used[500005];
int M[500005];

int n,q;
ll ans,tot,one;

void precomp()
{
	int i,j,mx,cnt,val,key,k,sz;

	mx = 0;
	FOR(i,1,n+1)
	{
		scanf("%d",&A[i]);
		Used[i] = 0;
		mx = max(mx,A[i]);
	}

	memset(isprime,true,sizeof(isprime));

	for(i = 2;i*i <= mx;i++)
	{
		if(isprime[i])
		for(j = i*i;j <= mx;j = j+i)
			isprime[j] = false;
	}

	cnt = 0;
	FOR(i,2,mx+1)
	{
		if(isprime[i])
			prime[cnt++] = i;
	}

	FOR(i,1,n+1)
	{
		if(A[i] == 1)
			continue;
		val = A[i];
		if(!M[A[i]])
		{
		FOR(j,0,cnt)
		{
			key = 0;
			while((val%prime[j]) == 0)
			{
				val = val/prime[j];
				key = 1;
			}
			if(key == 1)
				Div[i].pb(prime[j]);
			if(val == 1)
				break;
		}
		if(val > 1)
			Div[i].pb(val);
		M[A[i]] = i;
		}
		else
		{
			k = M[A[i]];
			sz = Div[k].size();
			for(j = 0;j < sz;j++)
			{
				Div[i].pb(Div[k][j]);
			}
		}

	}
}

void func(int a)
{
	int sz,sz1,i,y,cnt,val,j;

	if(Used[a] == 1)
	{
		if(A[a] == 1)
		{
			ans += tot;
			one++;
		}
		else
		{
			sz = Div[a].size();
			sz1 = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y  = y*2;
				}
				if(cnt&1)
				{
					ans -= arr[val];
					arr[val]++;
				}
				else
				{
					ans += arr[val];
					arr[val]++;
				}
			}

			ans += tot;
		}
		tot++;

	}
	else
	{
		tot--;
		if(A[a] == 1)
		{
			ans -= tot;
			one--;
		}
		else
		{
			sz = Div[a].size();
			sz1  = 1<<sz;
			for(i = 1;i < sz1;i++)
			{
				y = val = 1;
				cnt = 0;
				for(j = 0;j < sz;j++)
				{
					if(y&i)
					{
						val = val*Div[a][j];
						cnt++;
					}
					y = y*2;
				}
				if(cnt&1)
				{
					arr[val]--;

					//cout<<val<<" "<<arr[val]<<" val is\n";
					ans += arr[val];
				}
				else
				{
					arr[val]--;
					//cout<<val<<" "<<arr[val]<<" val is \n";
					ans -= arr[val];
				}
			}
			ans -= tot;
		}
	}

	cout<<ans<<endl;

}

int main()
{

	int mx,i,a,sz,j;

	scanf("%d %d",&n,&q);

	mx = 0;
	precomp();
	/*FOR(i,1,n+1)
	{
		sz = Div[i].size();
		FOR(j,0,sz)
			cout<<Div[i][j]<<" ";
		cout<<endl;
	}*/

	//exit(0);

	FOR(i,1,q+1)
	{
		scanf("%d",&a);
		Used[a] = (Used[a] == 1)?0:1;
		func(a);
	}

	return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=5e5;
int Sito[N+50];
int Ile[N];
vector<int> Aktu;
vector<int> Ilo;
int Czy[N];
int Wys[N];

void LiczSito(){
	ll i, j;
	for(i=2; i<=N+3; i++){
		if(Sito[i]!=0) continue;
		Sito[i]=i;
		for(j=i*i; j<=N+3; j+=i){
			if(Sito[j]==0) Sito[j]=i;
		}
	}
}

void Rozloz(int liczba){
	while( !Aktu.empty() ) Aktu.pop_back();
	while( !Ilo.empty() ) Ilo.pop_back();
	Aktu.push_back(0);
	while(Sito[liczba]>0){
		if(Aktu.back()!=Sito[liczba])   Aktu.push_back(Sito[liczba]);
		liczba/=Sito[liczba];
	}
}

int Przejdz(int liczba){
	int i, ile, ilo;  ile=0; ilo=1;
	for(i=1; i<=Aktu.size(); i++){
		if( ((1<<(i-1) )&liczba)>0 ){
			ilo=ilo*Aktu[i];
			ile++;
		}
	}
	Ilo.push_back(ilo);
	if(ile%2==1) return Ile[ilo];
	return -Ile[ilo];
}

int WlaczenIWylaczen(){
	int i, n, wyn, k; wyn=0;  n=Aktu.size()-1;
	for(i=1; i<(1<<n); i++){
		k=Przejdz(i);
		wyn+=k;
	}
	return wyn;
}

void Dodaj(int ile){
	for(int i=0; i<Ilo.size(); i++) Ile[ Ilo[i] ]+=ile;
}

int main (){
	int n, m, i, a, wyn, aktu, rozmiar; rozmiar=wyn=0;
	LiczSito();
	scanf("%d%d",  &n, &m);
	for(i=1; i<=n; i++) scanf("%d", &Wys[i]);
	for(i=1; i<=m; i++){
		scanf("%d", &a);
		Rozloz( Wys[a] );
		aktu=WlaczenIWylaczen();
		if(Czy[a]==0){
			Dodaj(1);
			if(Wys[a]==1) wyn+=rozmiar;
			else  wyn+=(rozmiar-aktu);
			Czy[a]=1;
			rozmiar++;
		 	printf("%d\n", wyn);
			continue;
		}
		Dodaj(-1);
		if(Wys[a]==1)  wyn-=(rozmiar-1);
		else  wyn-=(rozmiar-aktu);
		Czy[a]=0;
		rozmiar--;
		printf("%d\n", wyn);
	}
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=5e5;
int Sito[N+50];
int Ile[N];
vector<int> Aktu;
vector<int> Ilo;
int Czy[N];
int Wys[N];

void LiczSito(){
	ll i, j;
	for(i=2; i<=N+3; i++){
		if(Sito[i]!=0) continue;
		Sito[i]=i;
		for(j=i*i; j<=N+3; j+=i){
			if(Sito[j]==0) Sito[j]=i;
		}
	}
}

void Rozloz(int liczba){
	while( !Aktu.empty() ) Aktu.pop_back();
	while( !Ilo.empty() ) Ilo.pop_back();
	Aktu.push_back(0);
	while(Sito[liczba]>0){
		if(Aktu.back()!=Sito[liczba])   Aktu.push_back(Sito[liczba]);
		liczba/=Sito[liczba];
	}
}

int Przejdz(int liczba){
	int i, ile, ilo;  ile=0; ilo=1;
	for(i=1; i<=Aktu.size(); i++){
		if( ((1<<(i-1) )&liczba)>0 ){
			ilo=ilo*Aktu[i];
			ile++;
		}
	}
	Ilo.push_back(ilo);
	if(ile%2==1) return Ile[ilo];
	return -Ile[ilo];
}

int WlaczenIWylaczen(){
	int i, n, wyn, k; wyn=0;  n=Aktu.size()-1;
	for(i=1; i<(1<<n); i++){
		k=Przejdz(i);
		wyn+=k;
	}
	return wyn;
}

void Dodaj(int ile){
	for(int i=0; i<Ilo.size(); i++) Ile[ Ilo[i] ]+=ile;
}

int main (){
	int n, m, i, a, aktu, rozmiar; rozmiar=0;
	ll wyn=0;
	LiczSito();
	scanf("%d%d",  &n, &m);
	for(i=1; i<=n; i++) scanf("%d", &Wys[i]);
	for(i=1; i<=m; i++){
		scanf("%d", &a);
		Rozloz( Wys[a] );
		aktu=WlaczenIWylaczen();
		if(Czy[a]==0){
			Dodaj(1);
			if(Wys[a]==1) wyn+=(ll)rozmiar;
			else  wyn+=(ll)(rozmiar-aktu);
			Czy[a]=1;
			rozmiar++;
		 	printf("%d\n", wyn);
			continue;
		}
		Dodaj(-1);
		if(Wys[a]==1)  wyn-=(ll)(rozmiar-1);
		else  wyn-=(ll)(rozmiar-aktu);
		Czy[a]=0;
		rozmiar--;
		printf("%d\n", wyn);
	}
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=5e5;
int Sito[N+50];
int Ile[N];
vector<int> Aktu;
vector<int> Ilo;
int Czy[N];
int Wys[N];

void LiczSito(){
	ll i, j;
	for(i=2; i<=N+3; i++){
		if(Sito[i]!=0) continue;
		Sito[i]=i;
		for(j=i*i; j<=N+3; j+=i){
			if(Sito[j]==0) Sito[j]=i;
		}
	}
}

void Rozloz(int liczba){
	while( !Aktu.empty() ) Aktu.pop_back();
	while( !Ilo.empty() ) Ilo.pop_back();
	Aktu.push_back(0);
	while(Sito[liczba]>0){
		if(Aktu.back()!=Sito[liczba])   Aktu.push_back(Sito[liczba]);
		liczba/=Sito[liczba];
	}
}

int Przejdz(int liczba){
	int i, ile, ilo;  ile=0; ilo=1;
	for(i=1; i<=Aktu.size(); i++){
		if( ((1<<(i-1) )&liczba)>0 ){
			ilo=ilo*Aktu[i];
			ile++;
		}
	}
	Ilo.push_back(ilo);
	if(ile%2==1) return Ile[ilo];
	return -Ile[ilo];
}

int WlaczenIWylaczen(){
	int i, n, wyn, k; wyn=0;  n=Aktu.size()-1;
	for(i=1; i<(1<<n); i++){
		k=Przejdz(i);
		wyn+=k;
	}
	return wyn;
}

void Dodaj(int ile){
	for(int i=0; i<Ilo.size(); i++) Ile[ Ilo[i] ]+=ile;
}

int main (){
	int n, m, i, a, aktu, rozmiar; rozmiar=0;
	ll wyn=0;
	LiczSito();
	scanf("%d%d",  &n, &m);
	for(i=1; i<=n; i++) scanf("%d", &Wys[i]);
	for(i=1; i<=m; i++){
		scanf("%d", &a);
		Rozloz( Wys[a] );
		aktu=WlaczenIWylaczen();
		if(Czy[a]==0){
			Dodaj(1);
			if(Wys[a]==1) wyn+=(ll)(rozmiar);
			else  wyn+=(ll)(rozmiar-aktu);
			Czy[a]=1;
			rozmiar++;
			cout<<wyn<<"\n";
			continue;
		}
		Dodaj(-1);
		if(Wys[a]==1)  wyn-=(ll)(rozmiar-1);
		else  wyn-=(ll)(rozmiar-aktu);
		Czy[a]=0;
		rozmiar--;
		cout<<wyn<<"\n";
	}
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=5e5;
int Sito[N+50];
int Ile[N];
vector<int> Aktu;
vector<int> Ilo;
int Czy[N];
int Wys[N];

void LiczSito(){
	ll i, j;
	for(i=2; i<=N+3; i++){
		if(Sito[i]!=0) continue;
		Sito[i]=i;
		for(j=i*i; j<=N+3; j+=i){
			if(Sito[j]==0) Sito[j]=i;
		}
	}
}

void Rozloz(int liczba){
	while( !Aktu.empty() ) Aktu.pop_back();
	while( !Ilo.empty() ) Ilo.pop_back();
	Aktu.push_back(0);
	while(Sito[liczba]>0){
		if(Aktu.back()!=Sito[liczba])   Aktu.push_back(Sito[liczba]);
		liczba/=Sito[liczba];
	}
}

int Przejdz(int liczba){
	int i, ile, ilo;  ile=0; ilo=1;
	for(i=1; i<=Aktu.size(); i++){
		if( ((1<<(i-1) )&liczba)>0 ){
			ilo=ilo*Aktu[i];
			ile++;
		}
	}
	Ilo.push_back(ilo);
	if(ile%2==1) return Ile[ilo];
	return -Ile[ilo];
}

int WlaczenIWylaczen(){
	int i, n, wyn, k; wyn=0;  n=Aktu.size()-1;
	for(i=1; i<(1<<n); i++){
		k=Przejdz(i);
		wyn+=k;
	}
	return wyn;
}

void Dodaj(int ile){
	for(int i=0; i<Ilo.size(); i++) Ile[ Ilo[i] ]+=ile;
}

int main (){
	int n, m, i, a, wyn, aktu, rozmiar; rozmiar=wyn=0;
	LiczSito();
	scanf("%d%d",  &n, &m);
	for(i=1; i<=n; i++) scanf("%d", &Wys[i]);
	for(i=1; i<=m; i++){
		scanf("%d", &a);
		a=Wys[a];
		Rozloz(a);
		aktu=WlaczenIWylaczen();
		if(Czy[a]==0){
			Dodaj(1);
			if(a==1) wyn+=rozmiar;
			else  wyn+=(rozmiar-aktu);
			Czy[a]=1;
			rozmiar++;
		 	printf("%d\n", wyn);
			continue;
		}
		Dodaj(-1);
		if(a==1)  wyn-=(rozmiar-1);
		else  wyn-=(rozmiar-aktu);
		Czy[a]=0;
		rozmiar--;
		printf("%d\n", wyn);
	}
	return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;

const int N=5e5;
int Sito[N+50];
int Ile[N];
vector<int> Aktu;
vector<int> Ilo;
int Czy[N];
int Wys[N];

void LiczSito(){
	ll i, j;
	for(i=2; i<=N+3; i++){
		if(Sito[i]!=0) continue;
		Sito[i]=i;
		for(j=i*i; j<=N+3; j+=i){
			if(Sito[j]==0) Sito[j]=i;
		}
	}
}

void Rozloz(int liczba){
	while( !Aktu.empty() ) Aktu.pop_back();
	while( !Ilo.empty() ) Ilo.pop_back();
	Aktu.push_back(0);
	while(Sito[liczba]>0){
		if(Aktu.back()!=Sito[liczba])   Aktu.push_back(Sito[liczba]);
		liczba/=Sito[liczba];
	}
}

int Przejdz(int liczba){
	int i, ile, ilo;  ile=0; ilo=1;
	for(i=1; i<=Aktu.size(); i++){
		if( ((1<<(i-1) )&liczba)>0 ){
			ilo=ilo*Aktu[i];
			ile++;
		}
	}
	Ilo.push_back(ilo);
	if(ile%2==1) return Ile[ilo];
	return -Ile[ilo];
}

int WlaczenIWylaczen(){
	int i, n, wyn, k; wyn=0;  n=Aktu.size()-1;
	for(i=1; i<(1<<n); i++){
		k=Przejdz(i);
		wyn+=k;
	}
	return wyn;
}

void Dodaj(int ile){
	for(int i=0; i<Ilo.size(); i++) Ile[ Ilo[i] ]+=ile;
}

int main (){
	int n, m, i, a, wyn, aktu, rozmiar; rozmiar=wyn=0;
	LiczSito();
	scanf("%d%d",  &n, &m);
	for(i=1; i<=n; i++) scanf("%d", &Wys[i]);
	for(i=1; i<=m; i++){
		scanf("%d", &a);
		a=Wys[a];
		Rozloz(a);
		aktu=WlaczenIWylaczen();
		if(Czy[a]==0){
			Dodaj(1);
			wyn+=(rozmiar-aktu);
			Czy[a]=1;
			rozmiar++;
		 	printf("%d\n", wyn);
			continue;
		}
		Dodaj(-1);
		wyn-=(rozmiar-aktu-1);
		Czy[a]=0;
		rozmiar--;
		printf("%d\n", wyn);
	}
	return 0;
}


#include <bits/stdc++.h>

using namespace std;

const int N=201110,M=501110;
int A[N],pr[M],number[M];
bool fre[M];
int n,Q,Count;
long long ans;

void eratos(){
    for(int i=1;i<M;i++) pr[i]=i;
    for(int i=2;i<sqrt(M);i++)
        if(pr[i]==i)
        for(int k=i*i;k<M;k+=i)
            pr[k]=i;
}

void Anal(int u,int x){
    while(u>1){
        int v=pr[u];
        if(x==1) number[v]--;
        ans+=x*number[v];
        if(x==-1) number[v]++;
        while(u%v==0) u/=v;
    }
}

int main(){
    #ifndef ONLINE_JUDGE
        freopen("547C.inp","r",stdin);
        freopen("547C.out","w",stdout);
    #endif // ONLINE_JUDGE
    eratos();
    scanf("%d%d",&n,&Q);
    for(int i=1;i<=n;i++) scanf("%d",&A[i]);
    while(Q--){
        int u;
        scanf("%d",&u);
        if(fre[u]){
            Anal(A[u],1);
            fre[u]=false;
            ans-=--Count;
        }
        else{
            Anal(A[u],-1);
            fre[u]=true;
            ans+=Count++;
        }
        printf("%I64d\n",ans);
    }
}


#include <bits/stdc++.h>

using namespace std;

const int N=201110,M=501110;
int A[N],pr[M],number[M];
bool fre[N];
int n,Q,ans,Count;

void eratos(){
    for(int i=1;i<M;i++) pr[i]=i;
    for(int i=2;i<sqrt(M);i++)
        if(pr[i]==i)
        for(int k=i*i;k<M;k+=i)
            pr[k]=i;
}

void Anal(int u,int x){
    while(u>1){
        int v=pr[u];
        if(x==1) number[v]--;
        ans+=x*number[v];
        if(x==-1) number[v]++;
        while(u%v==0) u/=v;
    }
}

int main(){
    #ifndef ONLINE_JUDGE
        freopen("547C.inp","r",stdin);
        freopen("547C.out","w",stdout);
    #endif // ONLINE_JUDGE
    eratos();
    scanf("%d%d",&n,&Q);
    for(int i=1;i<=n;i++) scanf("%d",&A[i]);
    while(Q--){
        int u;
        scanf("%d",&u);
        if(fre[u]){
            Anal(A[u],1);
            fre[u]=false;
            Count--;
            ans-=Count;
        }
        else{
            Anal(A[u],-1);
            fre[u]=true;
            Count++;
            ans+=Count-1;
        }
        printf("%d\n",ans);
    }
}


#include <bits/stdc++.h>

using namespace std;

const int N=201110,M=501110;

int a[N],sieve[M],number[M];
bool choosed[N];
int n,Q;

int getbit(int x,int i){
    return 1&(x>>i);
}

void eratos(){
    for(int i=1;i<M;i++) sieve[i]=i;
    for(int i=2;i<sqrt(M);i++)
    if(sieve[i]==i)
        for(int k=i*i;k<M;k+=i)
            sieve[k]=i;
}

int main(){
    #ifndef ONLINE_JUDGE
        freopen("547C.inp","r",stdin);
        freopen("547C.out","w",stdout);
    #endif // ONLINE_JUDGE
    eratos();
    scanf("%d%d",&n,&Q);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    long long ans=0;
    while(Q--){
        int u,v,k,baseNum;
        scanf("%d",&k);
        u=a[k];
        vector <int> prime;
        while(u>1){
            v=sieve[u];
            prime.push_back(v);
            while(u%v==0) u/=v;
        }
        for(int mask=0;mask<1<<(prime.size());mask++){
            baseNum=1;
            for(int i=0;i<prime.size();i++)
                if(getbit(mask,i)) baseNum*=prime[i];
            if(!choosed[k]){
                if(__builtin_popcount(mask)&1) ans-=number[baseNum];
                else
                    ans+=number[baseNum];
                number[baseNum]++;
            }
            else{
                number[baseNum]--;
                if(__builtin_popcount(mask)&1) ans+=number[baseNum];
                else
                    ans-=number[baseNum];
            }
        }
        choosed[k]=!choosed[k];
        printf("%I64d\n",ans);
    }
}


#include <bits/stdc++.h>

using namespace std;

const int N=201110,M=501110;

int a[N],sieve[M],number[M];
bool choosed[N];
int n,Q;

int getbit(int x,int i){
    return 1&(x>>i);
}

void eratos(){
    for(int i=2;i<sqrt(M);i++)
    if(sieve[i]==0){
        sieve[i]=i;
        for(int k=i*i;k<M;k+=i)
            sieve[k]=i;
    }
}

int main(){
    #ifndef ONLINE_JUDGE
        freopen("547C.inp","r",stdin);
        freopen("547C.out","w",stdout);
    #endif // ONLINE_JUDGE
    eratos();
    scanf("%d%d",&n,&Q);
    for(int i=1;i<=n;i++)
        scanf("%d",&a[i]);
    long long ans=0;
    while(Q--){
        int u,v,k,baseNum;
        scanf("%d",&k);
        u=a[k];
        vector <int> prime;
        while(u>1){
            v=sieve[u];
            prime.push_back(v);
            while(u%v==0) u/=v;
        }
        for(int mask=0;mask<1<<(prime.size());mask++){
            baseNum=1;
            for(int i=0;i<prime.size();i++)
                if(getbit(mask,i)) baseNum*=prime[i];
            if(!choosed[k]){
                if(__builtin_popcount(mask)&1) ans-=number[baseNum];
                else
                    ans+=number[baseNum];
                number[baseNum]++;
            }
            else{
                number[baseNum]--;
                if(__builtin_popcount(mask)&1) ans+=number[baseNum];
                else
                    ans-=number[baseNum];
            }
        }
        choosed[k]=!choosed[k];
        printf("%I64d\n",ans);
    }
}


//
//https://www.cnblogs.com/SovietPower/p/9297375.html
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=2e5+5,MAX=5e5+5;

int n,cnt,A[N],P[N],mu[MAX],have[N],num[MAX];
long long Ans;
bool not_P[MAX];

inline int read()
{
	int now=0;register char c=gc();
	for(;!isdigit(c);c=gc());
	for(;isdigit(c);now=now*10+c-'0',c=gc());
	return now;
}
void Pre(int n)
{
	mu[1]=1;
	for(int i=2; i<=n; ++i)
	{
		if(!not_P[i]) P[++cnt]=i, mu[i]=-1;
		for(int j=1; j<=cnt&&i*P[j]<=n; ++j)
		{
			not_P[i*P[j]]=1;
			if(i%P[j]) mu[i*P[j]]=-mu[i];
			else {mu[i*P[j]]=0; break;}
		}
	}
}
void Add(int x,int val)
{
	for(int i=1; i*i<=x; ++i)//包括1啊→_→
		if(!(x%i))
		{
			Ans-=1ll*mu[i]*num[i]*(num[i]-1)>>1, num[i]+=val;
			Ans+=1ll*mu[i]*num[i]*(num[i]-1)>>1;
			if(i*i!=x)
			{
				int j=x/i;
				Ans-=1ll*mu[j]*num[j]*(num[j]-1)>>1, num[j]+=val;
				Ans+=1ll*mu[j]*num[j]*(num[j]-1)>>1;
			}
		}
}

int main()
{
	n=read(); int Q=read(),mx=0;
	for(int i=1; i<=n; ++i) mx=std::max(mx,A[i]=read()), have[i]=-1;
	Pre(mx); int x;
	while(Q--)
		have[x=read()]*=-1, Add(A[x],have[x]), printf("%I64d\n",Ans);
	return 0;
}


/*
171ms	4700KB
$Description$
给定n个数(1<=ai<=5e5)，每次从这n个数中选一个，如果当前集合中没有就加入集合，有就从集合中删去。每次操作后输出集合中互质的数对个数。
$Solution$
考虑暴力一点，对于要修改的数分解质因数，集合中与它互质的数的个数就是 n-(有1个公共质因数)+(有2个公共质因数)-...
维护一下每种因子(可以是多个因数的积)对应集合中的多少个数就行。
真的好暴力。。但是一个数的质因子大多也就4.5个，so是没问题的。
*/
#include <cstdio>
#include <cctype>
#include <algorithm>
//#define gc() getchar()
#define MAXIN 300000
#define gc() (SS==TT&&(TT=(SS=IN)+fread(IN,1,MAXIN,stdin),SS==TT)?EOF:*SS++)
const int N=2e5+5,MAX=5e5+3;

int n,Q,A[N],now,have[N],num[MAX],bit[23333],pcnt,P[N],cnt,p[233];
long long Ans;
bool not_P[MAX];
char IN[MAXIN],*SS=IN,*TT=IN;

inline int read()
{
	int now=0;register char c=gc();
	for(;!isdigit(c);c=gc());
	for(;isdigit(c);now=now*10+c-'0',c=gc());
	return now;
}
void Pre(int n)
{
	for(int i=2; i<=n; ++i)
	{
		if(!not_P[i]) P[++pcnt]=i;
		for(int j=1; j<=pcnt && i*P[j]<=n; ++j)
		{
			not_P[i*P[j]]=1;
			if(!(i%P[j])) break;
		}
	}
	for(int i=1,s=0; i<=5000; ++i,s=0)
	{
		for(int j=0; j<=13; ++j)
			if(i>>j & 1) ++s;
		bit[i]=s;
	}
}
void Div(int x)
{
	cnt=0;
	for(int i=1; i<=pcnt&&P[i]*P[i]<=x; ++i)//P[i]*P[i]<=x not P[i]<=x！不然就成O(n)的了！
		if(!(x%P[i]))
		{
			p[cnt++]=P[i];
			while(!(x%P[i])) x/=P[i];
		}
	if(x!=1) p[cnt++]=x;
}
void Add(int x,int val)
{
	Div(A[x]);
	long long ans=~val?now++:--now;//与除x以外的产生影响
	for(int i=1; i<(1<<cnt); ++i)
	{//枚举因子组合。。
		int fac=1;
		for(int j=0; j<cnt; ++j)
			if(i>>j & 1) fac*=p[j];
		if(val==-1) --num[fac];//不能算x本身！
		if(bit[i]&1) ans-=num[fac]; else ans+=num[fac];
		if(~val) num[fac]++;
	}
	Ans+=(long long)val*ans;
}

int main()
{
	n=read(), Q=read(); int mx=0;
	for(int i=1; i<=n; ++i) mx=std::max(mx,A[i]=read()), have[i]=-1;
	Pre(mx); int x;
	while(Q--)
		have[x=read()]*=-1, Add(x,have[x]), printf("%I64d\n",Ans);
	return 0;
}


/*
$Description$
给定n个数(1<=ai<=5e5)，每次从这n个数中选一个，如果当前集合中没有就加入集合，有就从集合中删去。每次操作后输出集合中互质的数对个数。
$Solution$
考虑暴力一点，对于要修改的数分解质因数，集合中与它互质的数的个数就是 n-(有1个公共质因数)+(有2个公共质因数)-...
维护一下每种因子(可以是多个因数的积)对应集合中的多少个数就行。
真的好暴力。。感觉有点儿问题吧。
*/
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=2e5+5,MAX=5e5+3;

int n,Q,A[N],now,have[N],num[MAX],bit[23333],pcnt,P[N],cnt,p[10005];
long long Ans;
bool not_P[MAX];

inline int read()
{
	int now=0;register char c=gc();
	for(;!isdigit(c);c=gc());
	for(;isdigit(c);now=now*10+c-'0',c=gc());
	return now;
}
void Pre(int n)
{
	for(int i=2; i<=n; ++i)
	{
		if(!not_P[i]) P[++pcnt]=i;
		for(int j=1; j<=pcnt && i*P[j]<=n; ++j)
		{
			not_P[i*P[j]]=1;
			if(!(i%P[j])) break;
		}
	}
	for(int i=1,s=0; i<=5000; ++i,s=0)
	{
		for(int j=0; j<=13; ++j)
			if(i>>j & 1) ++s;
		bit[i]=s;
	}
}
void Div(int x)
{
	cnt=0;
	for(int i=1; i<=pcnt&&P[i]<=x; ++i)
		if(!(x%P[i]))
		{
			p[cnt++]=P[i];
			while(!(x%P[i])) x/=P[i];
		}
	if(x!=1) p[cnt++]=x;
}
void Add(int x,int val)
{
	Div(A[x]);
	long long ans=~val?now++:--now;//与除x以外的产生影响
	for(int i=1; i<(1<<cnt); ++i)
	{//枚举因子组合。。
		int fac=1;
		for(int j=0; j<cnt; ++j)
			if(i>>j & 1) fac*=p[j];
		if(val==-1) --num[fac];//不能算x本身！
		if(bit[i]&1) ans-=num[fac]; else ans+=num[fac];
		if(~val) num[fac]++;
	}
	Ans+=(long long)val*ans;
}

int main()
{
	n=read(), Q=read(); int mx=0;
	for(int i=1; i<=n; ++i) mx=std::max(mx,A[i]=read()), have[i]=-1;
	Pre(mx); int x;
	while(Q--)
		have[x=read()]*=-1, Add(x,have[x]), printf("%I64d\n",Ans);
	return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
#define maxn 555555
ll n,q,a[maxn];
ll res,prime[maxn];
ll tol,num[2*maxn];//tol记录桌上牌数,num[i]记录桌上以i为因子的牌数
ll ans;//ans记录答案值
bool vis[maxn];
void get_prime(ll n)///对n素分解
{
    res=0;
    for(ll i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            prime[res++]=i;
            while(n%i==0)
                n/=i;
        }
    }
    if(n!=1)
        prime[res++]=n;
}
void sub(ll n)//将第n张牌从桌子上拿走
{
    vis[n]=false;//取消标记
    ll sum=0;//统计桌上原有牌中与n互素的牌数
    for(ll i=1;i<(1<<res);i++)//容斥
    {
        ll temp=1,ret=0;
        for(ll j=0;j<res;j++)
            if(i&(1<<j))
                temp*=prime[j],ret++;
        num[temp]--;//以temp为因子的牌数减一
        if(ret%2) sum+=num[temp];
        else sum-=num[temp];
    }
    tol--;//桌上牌数减一
    ans-=(tol-sum);
    printf("%I64d\n",ans);
    return ;
}
void add(ll n)//将第n张牌放在桌子上
{
    vis[n]=true;//标记这张牌
    ll sum=0;//统计桌上原有牌中与n互素的牌数
    for(ll i=1;i<(1<<res);i++)//容斥
    {
        int temp=1,ret=0;
        for(ll j=0;j<res;j++)
            if(i&(1<<j))
                temp*=prime[j],ret++;
        if(ret%2) sum+=num[temp];
        else sum-=num[temp];
        num[temp]++;//以temp为因子的牌数加一
    }
    ans+=(tol-sum);
    tol++;//桌上牌数加一
    printf("%I64d\n",ans);
    return ;
}
int main()
{
    scanf("%I64d%I64d",&n,&q);
    for(ll i=1;i<=n;i++)
        scanf("%I64d",&a[i]);
    memset(vis,false,sizeof(false));//初始化
    memset(num,0,sizeof(num));//初始化
    tol=0;
    ans=0;
    while(q--)
    {
        ll x;
        scanf("%I64d",&x);
        get_prime(a[x]);//对第x张牌的数字素分解
        if(vis[x])//x已经在桌上则将其拿走
            sub(x);
        else//x不在桌上则将其放在桌上
            add(x);
    }
    return 0;
}


/*
$Description$
给定n个数(1<=ai<=5e5)，每次从这n个数中选一个，如果当前集合中没有就加入集合，有就从集合中删去。每次操作后输出集合中互质的数对个数。
$Solution$
考虑暴力一点，对于要修改的数分解质因数，集合中与它互质的数的个数就是 n-(有1个公共质因数)+(有2个公共质因数)-...
维护一下每种因子(可以是多个因数的积)对应集合中的多少个数就行。
真的好暴力。。感觉有点儿问题吧。
*/
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=2e5+5,MAX=5e5+3;

int n,Q,A[N],now,have[N],num[MAX],bit[23333],pcnt,P[N],cnt,p[10005];
long long Ans;
bool not_P[MAX];

inline int read()
{
	int now=0;register char c=gc();
	for(;!isdigit(c);c=gc());
	for(;isdigit(c);now=now*10+c-'0',c=gc());
	return now;
}
void Pre(int n)
{
	for(int i=2; i<=n; ++i)
	{
		if(!not_P[i]) P[++pcnt]=i;
		for(int j=1; j<=pcnt && i*P[j]<=n; ++j)
		{
			not_P[i*P[j]]=1;
			if(!(i%P[j])) break;
		}
	}
	for(int i=1,s=0; i<=5000; ++i,s=0)
	{
		for(int j=0; j<=13; ++j)
			if(i>>j & 1) ++s;
		bit[i]=s;
	}
}
void Div(int x)
{
	cnt=0; int t=x;
	for(int i=1; i<=pcnt&&P[i]*P[i]<=x; ++i)//P[i]*P[i]<=x not P[i]<=x！不然就成O(n)的了！
		if(!(x%P[i]))
		{
			p[cnt++]=P[i];
			while(!(x%P[i])) x/=P[i];
		}
	if(x!=1) p[cnt++]=x;
}
void Add(int x,int val)
{
	Div(A[x]);
	long long ans=~val?now++:--now;//与除x以外的产生影响
	for(int i=1; i<(1<<cnt); ++i)
	{//枚举因子组合。。
		int fac=1;
		for(int j=0; j<cnt; ++j)
			if(i>>j & 1) fac*=p[j];
		if(val==-1) --num[fac];//不能算x本身！
		if(bit[i]&1) ans-=num[fac]; else ans+=num[fac];
		if(~val) num[fac]++;
	}
	Ans+=(long long)val*ans;
}

int main()
{
	n=read(), Q=read(); int mx=0;
	for(int i=1; i<=n; ++i) mx=std::max(mx,A[i]=read()), have[i]=-1;
	Pre(mx); int x;
	while(Q--)
		have[x=read()]*=-1, Add(x,have[x]), printf("%I64d\n",Ans);
	return 0;
}


/*
$Description$
给定n个数(1<=ai<=5e5)，每次从这n个数中选一个，如果当前集合中没有就加入集合，有就从集合中删去。每次操作后输出集合中互质的数对个数。
$Solution$
考虑暴力一点，对于要修改的数分解质因数，集合中与它互质的数的个数就是 n-(有1个公共质因数)+(有2个公共质因数)-...
维护一下每种因子(可以是多个因数的积)对应集合中的多少个数就行。
真的好暴力。。感觉有点儿问题吧。
*/
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=2e5+5,MAX=5e5+3;

int n,Q,A[N],now,have[N],num[MAX],bit[23333],pcnt,P[N],cnt,p[10005];
long long Ans;
bool not_P[MAX];

inline int read()
{
	int now=0;register char c=gc();
	for(;!isdigit(c);c=gc());
	for(;isdigit(c);now=now*10+c-'0',c=gc());
	return now;
}
void Pre(int n)
{
	for(int i=2; i<=n; ++i)
	{
		if(!not_P[i]) P[++pcnt]=i;
		for(int j=1; j<=pcnt && i*P[j]<=n; ++j)
		{
			not_P[i*P[j]]=1;
			if(!(i%P[j])) break;
		}
	}
	for(int i=1,s=0; i<=5000; ++i,s=0)
	{
		for(int j=0; j<=13; ++j)
			if(i>>j & 1) ++s;
		bit[i]=s;
	}
}
void Div(int x)
{
	cnt=0;
	for(int i=1; i<=pcnt&&P[i]<=x; ++i)
		if(!(x%P[i]))
		{
			p[cnt++]=P[i];
			int t=1;
			while(!(x%P[i]))
			{
				if(++t>5000) printf("MMP %d %d %d\n",x,i,P[i]);
				x/=P[i];
			}
		}
	if(x!=1) p[cnt++]=x;
}
void Add(int x,int val)
{
	Div(A[x]);
	long long ans=~val?now++:--now;//与除x以外的产生影响
	for(int i=1; i<(1<<cnt); ++i)
	{//枚举因子组合。。
		int fac=1;
		for(int j=0; j<cnt; ++j)
			if(i>>j & 1) fac*=p[j];
		if(val==-1) --num[fac];//不能算x本身！
		if(bit[i]&1) ans-=num[fac]; else ans+=num[fac];
		if(~val) num[fac]++;
	}
	Ans+=(long long)val*ans;
}

int main()
{
	n=read(), Q=read(); int mx=0;
	for(int i=1; i<=n; ++i) mx=std::max(mx,A[i]=read()), have[i]=-1;
	Pre(mx); int x;
	while(Q--)
		have[x=read()]*=-1, Add(x,have[x]), printf("%I64d\n",Ans);
	return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
#define maxn 555555
ll n,q,a[maxn];
ll cnt,p[maxn];
ll tol,num[2*maxn];//tol记录桌上牌数,num[i]记录桌上以i为因子的牌数
ll ans;//ans记录答案值
bool vis[maxn];
int pcnt,P[maxn];
bool not_P[maxn];

void Pre(int n)
{
	for(int i=2; i<=n; ++i)
	{
		if(!not_P[i]) P[++pcnt]=i;
		for(int j=1; j<=pcnt && i*P[j]<=n; ++j)
		{
			not_P[i*P[j]]=1;
			if(!(i%P[j])) break;
		}
	}
}
void Div(int n)
{
	cnt=0;
	for(ll i=2;i*i<=n;i++)
    {
        if(n%i==0)
        {
            p[cnt++]=i;
            while(n%i==0)
                n/=i;
        }
    }
	if(n!=1) p[cnt++]=n;
}
void sub(ll n)//将第n张牌从桌子上拿走
{
    vis[n]=false;//取消标记
    ll sum=0;//统计桌上原有牌中与n互素的牌数
    for(ll i=1;i<(1<<cnt);i++)//容斥
    {
        ll temp=1,ret=0;
        for(ll j=0;j<cnt;j++)
            if(i&(1<<j))
                temp*=p[j],ret++;
        num[temp]--;//以temp为因子的牌数减一
        if(ret%2) sum+=num[temp];
        else sum-=num[temp];
    }
    tol--;//桌上牌数减一
    ans-=(tol-sum);
    printf("%I64d\n",ans);
    return ;
}
void add(ll n)//将第n张牌放在桌子上
{
    vis[n]=true;//标记这张牌
    ll sum=0;//统计桌上原有牌中与n互素的牌数
    for(ll i=1;i<(1<<cnt);i++)//容斥
    {
        int temp=1,ret=0;
        for(ll j=0;j<cnt;j++)
            if(i&(1<<j))
                temp*=p[j],ret++;
        if(ret%2) sum+=num[temp];
        else sum-=num[temp];
        num[temp]++;//以temp为因子的牌数加一
    }
    ans+=(tol-sum);
    tol++;//桌上牌数加一
    printf("%I64d\n",ans);
    return ;
}
int main()
{
    scanf("%I64d%I64d",&n,&q);
    Pre(500000);
    for(ll i=1;i<=n;i++)
        scanf("%I64d",&a[i]);
    memset(vis,false,sizeof(false));//初始化
    memset(num,0,sizeof(num));//初始化
    tol=0;
    ans=0;
    while(q--)
    {
        ll x;
        scanf("%I64d",&x);
        Div(a[x]);//对第x张牌的数字素分解
        if(vis[x])//x已经在桌上则将其拿走
            sub(x);
        else//x不在桌上则将其放在桌上
            add(x);
    }
    return 0;
}


/*
$Description$
给定n个数(1<=ai<=5e5)，每次从这n个数中选一个，如果当前集合中没有就加入集合，有就从集合中删去。每次操作后输出集合中互质的数对个数。
$Solution$
考虑暴力一点，对于要修改的数分解质因数，集合中与它互质的数的个数就是 n-(有1个公共质因数)+(有2个公共质因数)-...
维护一下每种因子(可以是多个因数的积)对应集合中的多少个数就行。
真的好暴力。。感觉有点儿问题吧。
*/
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=2e5+5,MAX=5e5+3;

int n,Q,A[N],now,have[N],num[N],bit[23333],pcnt,P[N],cnt,p[10005];
long long Ans;
bool not_P[MAX];

inline int read()
{
	int now=0;register char c=gc();
	for(;!isdigit(c);c=gc());
	for(;isdigit(c);now=now*10+c-'0',c=gc());
	return now;
}
void Pre(int n)
{
	for(int i=2; i<=n; ++i)
	{
		if(!not_P[i]) P[++pcnt]=i;
		for(int j=1; j<=pcnt && i*P[j]<=n; ++j)
		{
			not_P[i*P[j]]=1;
			if(!(i%P[j])) break;
		}
	}
	for(int i=1,s=0; i<=5000; ++i,s=0)
	{
		for(int j=0; j<=13; ++j)
			if(i>>j & 1) ++s;
		bit[i]=s;
	}
}
void Div(int x)
{
	cnt=0;
	for(int i=1; i<=pcnt&&P[i]<=x; ++i)
		if(!(x%P[i]))
		{
			p[cnt++]=P[i];
			while(!(x%P[i])) x/=P[i];
		}
	if(x!=1) p[cnt++]=x;
}
void Add(int x,int val)
{
	Div(A[x]);
	long long ans=~val?now:now-1; now+=val;//与除x以外的产生影响
	for(int i=1; i<(1<<cnt); ++i)
	{//枚举因子组合。。
		int fac=1;
		for(int j=0; j<cnt; ++j)
			if(i>>j & 1) fac*=p[j];
		if(bit[i]&1) ans-=num[fac]; else ans+=num[fac];
		num[fac]+=val;
	}
	Ans+=val*ans;
}

int main()
{
	n=read(), Q=read(); int mx=0;
	for(int i=1; i<=n; ++i) mx=std::max(mx,A[i]=read()), have[i]=-1;
	Pre(mx); int x;
	while(Q--)
		have[x=read()]*=-1, Add(x,have[x]), printf("%I64d\n",Ans);
	return 0;
}


#include<iostream>
#include<cstdio>
#include<algorithm>
#include<cstring>
using namespace std;
typedef long long ll;
#define maxn 555555
ll n,q,a[maxn];
ll cnt,p[maxn];
ll tol,num[2*maxn];//tol记录桌上牌数,num[i]记录桌上以i为因子的牌数
ll ans;//ans记录答案值
bool vis[maxn];
int pcnt,P[maxn];
bool not_P[maxn];

void Pre(int n)
{
	for(int i=2; i<=n; ++i)
	{
		if(!not_P[i]) P[++pcnt]=i;
		for(int j=1; j<=pcnt && i*P[j]<=n; ++j)
		{
			not_P[i*P[j]]=1;
			if(!(i%P[j])) break;
		}
	}
}
void Div(int x)
{
	cnt=0;
	for(int i=1; i<=pcnt&&P[i]<=x; ++i)
		if(!(x%P[i]))
		{
			p[cnt++]=P[i];
			while(!(x%P[i])) x/=P[i];
		}
	if(x!=1) p[cnt++]=x;
}
void sub(ll n)//将第n张牌从桌子上拿走
{
    vis[n]=false;//取消标记
    ll sum=0;//统计桌上原有牌中与n互素的牌数
    for(ll i=1;i<(1<<cnt);i++)//容斥
    {
        ll temp=1,ret=0;
        for(ll j=0;j<cnt;j++)
            if(i&(1<<j))
                temp*=p[j],ret++;
        num[temp]--;//以temp为因子的牌数减一
        if(ret%2) sum+=num[temp];
        else sum-=num[temp];
    }
    tol--;//桌上牌数减一
    ans-=(tol-sum);
    printf("%I64d\n",ans);
    return ;
}
void add(ll n)//将第n张牌放在桌子上
{
    vis[n]=true;//标记这张牌
    ll sum=0;//统计桌上原有牌中与n互素的牌数
    for(ll i=1;i<(1<<cnt);i++)//容斥
    {
        int temp=1,ret=0;
        for(ll j=0;j<cnt;j++)
            if(i&(1<<j))
                temp*=p[j],ret++;
        if(ret%2) sum+=num[temp];
        else sum-=num[temp];
        num[temp]++;//以temp为因子的牌数加一
    }
    ans+=(tol-sum);
    tol++;//桌上牌数加一
    printf("%I64d\n",ans);
    return ;
}
int main()
{
    scanf("%I64d%I64d",&n,&q);
    Pre(500000);
    for(ll i=1;i<=n;i++)
        scanf("%I64d",&a[i]);
    memset(vis,false,sizeof(false));//初始化
    memset(num,0,sizeof(num));//初始化
    tol=0;
    ans=0;
    while(q--)
    {
        ll x;
        scanf("%I64d",&x);
        Div(a[x]);//对第x张牌的数字素分解
        if(vis[x])//x已经在桌上则将其拿走
            sub(x);
        else//x不在桌上则将其放在桌上
            add(x);
    }
    return 0;
}


/*
$Description$
给定n个数(1<=ai<=5e5)，每次从这n个数中选一个，如果当前集合中没有就加入集合，有就从集合中删去。每次操作后输出集合中互质的数对个数。
$Solution$
考虑暴力一点，对于要修改的数分解质因数，集合中与它互质的数的个数就是 n-(有1个公共质因数)+(有2个公共质因数)-...
维护一下每种因子(可以是多个因数的积)对应集合中的多少个数就行。
真的好暴力。。感觉有点儿问题吧。
*/
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=2e5+5,MAX=5e5+3;

int n,Q,A[N],now,have[N],num[MAX],bit[23333],pcnt,P[N],cnt,p[10005];
long long Ans;
bool not_P[MAX];

inline int read()
{
	int now=0;register char c=gc();
	for(;!isdigit(c);c=gc());
	for(;isdigit(c);now=now*10+c-'0',c=gc());
	return now;
}
void Pre(int n)
{
	for(int i=2; i<=n; ++i)
	{
		if(!not_P[i]) P[++pcnt]=i;
		for(int j=1; j<=pcnt && i*P[j]<=n; ++j)
		{
			not_P[i*P[j]]=1;
			if(!(i%P[j])) break;
		}
	}
	for(int i=1,s=0; i<=5000; ++i,s=0)
	{
		for(int j=0; j<=13; ++j)
			if(i>>j & 1) ++s;
		bit[i]=s;
	}
}
void Div(int x)
{
	cnt=0;
	for(int i=1; i<=pcnt&&P[i]<=x; ++i)
		if(!(x%P[i]))
		{
			p[cnt++]=P[i];
			while(!(x%P[i])) x/=P[i];
		}
	if(x!=1) p[cnt++]=x;
}
void Add(int x,int val)
{
	Div(A[x]);
	long long ans=~val?now:now-1; now+=val;//与除x以外的产生影响
	for(int i=1; i<(1<<cnt); ++i)
	{//枚举因子组合。。
		int fac=1;
		for(int j=0; j<cnt; ++j)
			if(i>>j & 1) fac*=p[j];
		if(bit[i]&1) ans-=num[fac]; else ans+=num[fac];
		num[fac]+=val;
	}
	Ans+=(long long)val*ans;
}

int main()
{
	n=read(), Q=read(); int mx=0;
	for(int i=1; i<=n; ++i) mx=std::max(mx,A[i]=read()), have[i]=-1;
	Pre(mx); int x;
	while(Q--)
		have[x=read()]*=-1, Add(x,have[x]), printf("%I64d\n",Ans);
	return 0;
}


/*
$Description$
给定n个数(1<=ai<=5e5)，每次从这n个数中选一个，如果当前集合中没有就加入集合，有就从集合中删去。每次操作后输出集合中互质的数对个数。
$Solution$
考虑暴力一点，对于要修改的数分解质因数，集合中与它互质的数的个数就是 n-(有1个公共质因数)+(有2个公共质因数)-...
维护一下每种因子(可以是多个因数的积)对应集合中的多少个数就行。
真的好暴力。。感觉有点儿问题吧。
*/
#include <cstdio>
#include <cctype>
#include <algorithm>
#define gc() getchar()
const int N=2e5+5,MAX=5e5+3;

int n,Q,A[N],now,have[N],num[MAX],bit[23333],pcnt,P[N],cnt,p[10005];
long long Ans;
bool not_P[MAX];

inline int read()
{
	int now=0;register char c=gc();
	for(;!isdigit(c);c=gc());
	for(;isdigit(c);now=now*10+c-'0',c=gc());
	return now;
}
void Pre(int n)
{
	for(int i=2; i<=n; ++i)
	{
		if(!not_P[i]) P[++pcnt]=i;
		for(int j=1; j<=pcnt && i*P[j]<=n; ++j)
		{
			not_P[i*P[j]]=1;
			if(!(i%P[j])) break;
		}
	}
	for(int i=1,s=0; i<=5000; ++i,s=0)
	{
		for(int j=0; j<=13; ++j)
			if(i>>j & 1) ++s;
		bit[i]=s;
	}
}
void Div(int x)
{
	cnt=0; int t=x;
	for(int i=1; i<=pcnt&&P[i]<=x; ++i)
		if(!(x%P[i]))
		{
			p[cnt++]=P[i];
			while(!(x%P[i])) x/=P[i];
		}
	if(x!=1) p[cnt++]=x;
	if(cnt>14) printf("Too Big:%d %d\n",t,cnt);
}
void Add(int x,int val)
{
	Div(A[x]);
	long long ans=~val?now++:--now;//与除x以外的产生影响
	for(int i=1; i<(1<<cnt); ++i)
	{//枚举因子组合。。
		int fac=1;
		for(int j=0; j<cnt; ++j)
			if(i>>j & 1) fac*=p[j];
		if(val==-1) --num[fac];//不能算x本身！
		if(bit[i]&1) ans-=num[fac]; else ans+=num[fac];
		if(~val) num[fac]++;
	}
	Ans+=(long long)val*ans;
}

int main()
{
	n=read(), Q=read(); int mx=0;
	for(int i=1; i<=n; ++i) mx=std::max(mx,A[i]=read()), have[i]=-1;
	Pre(mx); int x;
	while(Q--)
		have[x=read()]*=-1, Add(x,have[x]), printf("%I64d\n",Ans);
	return 0;
}


// author: lkx
// Problem:
// ID:
#include<bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define fi first
#define se second
#define PB push_back
#define MP make_pair
#define PH push

const int MOD=1e9+7;

int cnt[500200];
int n,q;
int a[500500];
int use[200200],tmp=0;
long long ans=0;
vector<int> pp[200200];

int solve(int ind,int add)
{
	vector<int> p=pp[ind];
	for(int mask=0;mask<(1<<p.size());mask++)
	{
		int bites=add;
		int mult=1;
		for(int i=0;i<p.size();i++)
			if(mask&(1<<i))
				mult*=p[i],bites*=-1;
		ans+=cnt[mult]*bites;
	}
	for(int mask=0;mask<(1<<p.size());mask++)
	{
		int bites=add;
		int mult=1;
		for(int i=0;i<p.size();i++)
			if(mask&(1<<i))
				mult*=p[i],bites*=-1;
//		cout<<"mm="<<mask<<" "<<mult<<" ";
		cnt[mult]+=add;
	}
	if(a[ind]==1&&add==-1) ans++;
//	cout<<"ind="<<ind<<";p="<<p.size()<<endl;
//	for(int i=0;i<p.size();i++) cout<<p[i]; cout<<endl;
}

int num1=0;

int main()
{
	cin>>n>>q;
	for(int i=1;i<=n;i++)
		cin>>a[i];
	for(int i=1;i<=n;i++)
	{
		int aa=a[i];
		for(int j=2;j*j<=aa;j++)
			if(aa%j==0)
			{
				pp[i].PB(j);
				while(aa%j==0)
					aa/=j;
			}
		if(aa>1) pp[i].PB(aa);
//		cout<<i<<" ";for(int k=0;k<pp[i].size();k++)cout<<pp[i][k]<<" "; cout<<endl;
	}
	memset(use,0,sizeof(use));
	for(int i=0;i<q;i++)
	{
		int t,res=0;
		cin>>t;
		use[t]^=1;
		solve(t,use[t]==1?1:-1);
		cout<<ans<<endl;
//		cout<<"cnt:";for(int i=1;i<10;i++) cout<<cnt[i]<<" "; cout<<endl;
	}
	return 0;
}


// author: lkx
// Problem:
// ID:
#include<bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define fi first
#define se second
#define PB push_back
#define MP make_pair
#define PH push
#define ll long long
#define ull unsigned long long
#define debug(x) cerr<<#x<<"="<<x<<'\n'
//#define DEBUG

const int MOD=1e9+7;

int n,q;
int a[200100];
int have[200100];
int cnt[500100],Cnt=0,Cnt1=0;
int p[100000],prim[500100],pcnt=0;
ll ans=0;

void init()
{
	for(int i=2;i<500010;i++)
		if(!prim[i])
		{
			p[pcnt++]=i;
			for(int j=i*2;j<500010;j+=i)
				prim[j]=1;
		}
}

int main()
{
	#ifdef DEBUG
	clock_t tStart = clock();
	#endif
	init();
	scanf("%d%d",&n,&q);
	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	for(int i=0;i<q;i++)
	{
		int id;
		scanf("%d",&id);
		id--;
		int k=a[id];
		vector<int> vp,v;
		for(int j=0;j<pcnt;j++)
			if(k%p[j]==0)
				vp.PB(p[j]);
		int res=0;
		for(int msk=1;msk<(1<<vp.size());msk++)
		{
			int num=1;
			for(int j=0;j<vp.size();j++)
				if(msk>>j&1)
					num*=vp[j];
			int fuck=__builtin_popcount(msk);
			if(!have[id])
			{
				if(fuck&1) res+=cnt[num];
				else res-=cnt[num];
			}
			else
			{
				if(fuck&1) res+=cnt[num]-1;
				else res-=cnt[num]-1;
			}
			v.PB(num);
		}
		if(!have[id])
		{
			for(int i=0;i<v.size();i++) cnt[v[i]]++;
			have[id]=1;
			ans+=res;
			Cnt++;
		}
		else
		{
			for(int i=0;i<v.size();i++) cnt[v[i]]--;
			have[id]=0;
			ans-=res;
			Cnt--;
		}
		printf("%lld\n",(ll)Cnt*(Cnt-1)/2-ans);
	}
	#ifdef DEBUG
	cerr<<"\nExecution time: "<<(((double)clock() - tStart)/CLOCKS_PER_SEC)*1e3<<"ms.\n";
	#endif
	return 0;
}
/*
5 6
1 2 3 4 6
1
2
3
4
5
1
*/


// author: lkx
// Problem:
// ID:
#include<bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define fi first
#define se second
#define PB push_back
#define MP make_pair
#define PH push
#define ll long long
#define ull unsigned long long
#define debug(x) cerr<<#x<<"="<<x<<'\n'
//#define DEBUG

const int MOD=1e9+7;

int n,q;
int a[200100];
int have[200100];
int cnt[500100],Cnt=0,Cnt1=0;
int p[100000],prim[500100],pcnt=0;
ll ans=0;
vector<pii> v[200100];

void init()
{
	for(int i=2;i<500010;i++)
		if(!prim[i])
		{
			p[pcnt++]=i;
			for(int j=i*2;j<500010;j+=i)
				prim[j]=1;
		}
	for(int i=0;i<n;i++)
	{
		vector<int> vp;
		for(int j=0;j<pcnt;j++)
			if(a[i]%p[j]==0)
				vp.PB(p[j]);
		int res=0;
		for(int msk=1;msk<(1<<vp.size());msk++)
		{
			int num=1;
			for(int j=0;j<vp.size();j++)
				if(msk>>j&1)
					num*=vp[j];
			v[i].PB(MP(num,(__builtin_popcount(msk)&1)));
		}
	}
}

int main()
{
	#ifdef DEBUG
	clock_t tStart = clock();
	#endif
	scanf("%d%d",&n,&q);
	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	init();
	for(int i=0;i<q;i++)
	{
		int id;
		scanf("%d",&id);
		id--;
		ll res=0;
		for(int j=0;j<v[id].size();j++)
			if(!have[id])
			{
				pii num=v[id][j];
				if(num.se) res+=cnt[num.fi];
				else res-=cnt[num.fi];
				cnt[num.fi]++;
			}
			else
			{
				pii num=v[id][j];
				if(num.se) res+=cnt[num.fi]-1;
				else res-=cnt[num.fi]-1;
				cnt[num.fi]--;
			}
		if(!have[id])
		{
			have[id]=1;
			ans+=res;
			Cnt++;
		}
		else
		{
			have[id]=0;
			ans-=res;
			Cnt--;
		}
		printf("%I64d\n",(ll)Cnt*(Cnt-1)/2-ans);
	}
	#ifdef DEBUG
	cerr<<"\nExecution time: "<<(((double)clock() - tStart)/CLOCKS_PER_SEC)*1e3<<"ms.\n";
	#endif
	return 0;
}
/*
5 6
1 2 3 4 6
1
2
3
4
5
1
*/


// author: lkx
// Problem:
// ID:
#include<bits/stdc++.h>
using namespace std;

#define pii pair<int,int>
#define fi first
#define se second
#define PB push_back
#define MP make_pair
#define PH push
#define ll long long
#define ull unsigned long long
#define debug(x) cerr<<#x<<"="<<x<<'\n'
//#define DEBUG

const int MOD=1e9+7;

int n,q;
int a[200100];
int have[200100];
int cnt[500100],Cnt=0,Cnt1=0;
int p[100000],prim[500100],pcnt=0;
ll ans=0;
vector<pii> v[200100];

void init()
{
	for(int i=2;i<500010;i++)
		if(!prim[i])
		{
			p[pcnt++]=i;
			for(int j=i*2;j<500010;j+=i)
				prim[j]=1;
		}
	vector<int> vp;
	for(int i=0;i<n;i++)
	{
		vp.clear();
		for(int j=0;j<pcnt;j++)
			if(a[i]%p[j]==0)
				vp.PB(p[j]);
		int res=0;
		for(int msk=1;msk<(1<<vp.size());msk++)
		{
			int num=1,fuck=0;
			for(int j=0;j<vp.size();j++)
				if(msk>>j&1)
					num*=vp[j],fuck^=1;
			v[i].PB(MP(num,fuck));
		}
	}
}

int main()
{
	#ifdef DEBUG
	clock_t tStart = clock();
	#endif
	scanf("%d%d",&n,&q);
	for(int i=0;i<n;i++) scanf("%d",&a[i]);
	init();
	for(int i=0;i<q;i++)
	{
		int id;
		scanf("%d",&id);
		id--;
		ll res=0;
		for(int j=0;j<v[id].size();j++)
			if(!have[id])
			{
				pii num=v[id][j];
				if(num.se) res+=cnt[num.fi];
				else res-=cnt[num.fi];
				cnt[num.fi]++;
			}
			else
			{
				pii num=v[id][j];
				if(num.se) res+=cnt[num.fi]-1;
				else res-=cnt[num.fi]-1;
				cnt[num.fi]--;
			}
		if(!have[id])
		{
			have[id]=1;
			ans+=res;
			Cnt++;
		}
		else
		{
			have[id]=0;
			ans-=res;
			Cnt--;
		}
		printf("%I64d\n",(ll)Cnt*(Cnt-1)/2-ans);
	}
	#ifdef DEBUG
	cerr<<"\nExecution time: "<<(((double)clock() - tStart)/CLOCKS_PER_SEC)*1e3<<"ms.\n";
	#endif
	return 0;
}
/*
5 6
1 2 3 4 6
1
2
3
4
5
1
*/


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<ll  ,ll  > ii;
ll  a[500005],fact[500000],num[500005],maxval=500005;
bool b[500005],st[500005],in[500005];
void build(){

    for(ll  i=1;i<=maxval;i++){
        b[i]=1;st[i]=1;}
    for(ll  i=2;i<=maxval;i++)
        if(!b[i])
            continue;
        else
        {
            fact[i]=i;
            if(i<sqrt(maxval+10))
            for(ll  j=i*i;j<=maxval;j+=i)
                if(b[j])
            {
                fact[j]=i;
                b[j]=0;}
        }
    st[1]=0;
    for(ll  i=2;i<=maxval;i++)
        st[i]=!st[i/fact[i]];
}
int      main()
{
   // freopen("in","r",stdin);
    ll  n,q,pre=0,co=0;
    build();
    cin>>n>>q;
    memset(num,0,sizeof num);
    memset(in,0,sizeof in);
    for(ll  i=1;i<=n;i++)
        scanf("%lld",&a[i]);

    for(ll  i=1;i<=q;i++)
    {   ll  ind;
    set<ll  > se;
    set<ll  > ::iterator it;;
    vector<ll  > v;
        scanf("%lld",&ind);
        ll  val=a[ind];
        while(val!=1){
            v.push_back(fact[val]);
            val/=fact[val];
        }
        ll  ans=0;
        for(ll  j=0;j<v.size();j++){
            for(it=se.begin();it!=se.end();it++)
            {
                if((*it)%v[j])
                  se.insert(v[j]*(*it));
            }
            se.insert(v[j]);
        }
        for(it=se.begin();it!=se.end();it++)
        {
            ll  p=*it;
            if(st[*it])
                ans+=num[*it];
            else
                ans-=num[*it];
            if(!in[ind])
                num[*it]++;
            else
                num[*it]--;
        }
        if(!in[ind]){
            if(a[ind]==1)
            {
                printf("%lld\n",pre+co);
            pre=pre+co;
            }
            else{
                printf("%lld\n",pre+co-ans);
            pre=pre+co-ans;}
            co++;
        }
        else{
            if(a[ind]==1)
            {   printf("%lld\n",pre-(co-1));
            pre=pre-(co-1);
            }
            else{
                printf("%lld\n",pre-(co-ans));
             pre=pre-(co-ans);}
            co--;

        }
        in[ind]=!in[ind];

    }

  return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int ,int > ii;
int a[500005],fact[500000],num[500005],maxval=500005;
bool b[500005],st[500005],in[500005];
void build(){

    for(int i=1;i<=maxval;i++){
        b[i]=1;st[i]=1;}
    for(int i=2;i<=maxval;i++)
        if(!b[i])
            continue;
        else
        {
            fact[i]=i;
            if(i<sqrt(maxval+10))
            for(int j=i*i;j<=maxval;j+=i)
                if(b[j])
            {
                    st[j]=!st[i];
                fact[j]=i;
                b[j]=0;}
        }
}
int     main()
{
   // freopen("in","r",stdin);
    int n,q,pre=0,co=0;
    build();
    cin>>n>>q;
    memset(num,0,sizeof num);
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=q;i++)
    {   int ind;
    set<int > se;
    set<int > ::iterator it;;
    vector<int > v;
        cin>>ind;
        int val=a[ind];
        while(val!=1){
            v.push_back(fact[val]);
            val/=fact[val];
        }
        int ans=0;
        for(int j=0;j<v.size();j++){
            for(it=se.begin();it!=se.end();it++)
            {
                if((*it)%v[j])
                  se.insert(v[j]*(*it));
            }
            se.insert(v[j]);
        }
        for(it=se.begin();it!=se.end();it++)
        {
            if(st[*it])
                ans+=num[*it];
            else
                ans-=num[*it];
            if(!in[ind])
                num[*it]++;
            else
                num[*it]--;
        }
        if(!in[ind]){
            cout<<pre+co-ans<<endl;
            pre=pre+co-ans;
            co++;
        }
        else{
            cout<<pre-(co-ans)+1<<endl;
             pre=pre-(co-ans);
            co--;

        }
        in[ind]=!in[ind];

    }

  return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int ,int > ii;
int a[500005],fact[500000],num[500005],maxval=500005;
bool b[500005],st[500005],in[500005];
void build(){

    for(int i=1;i<=maxval;i++){
        b[i]=1;st[i]=1;}
    for(int i=2;i<=maxval;i++)
        if(!b[i])
            continue;
        else
        {
            fact[i]=i;
            if(i<sqrt(maxval+10))
            for(int j=i*i;j<=maxval;j+=i)
                if(b[j])
            {
                    st[j]=!st[i];
                fact[j]=i;
                b[j]=0;}
        }
}
int     main()
{
  //  freopen("in","r",stdin);
    int n,q,pre=0,co=0;
    build();
    cin>>n>>q;
    memset(num,0,sizeof num);
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=q;i++)
    {   int ind;
    set<int > se;
    set<int > ::iterator it;;
    vector<int > v;
        cin>>ind;
        int val=a[ind];
        while(val!=1){
            v.push_back(fact[val]);
            val/=fact[val];
        }
        int ans=0;
        for(int j=0;j<v.size();j++){
            for(it=se.begin();it!=se.end();it++)
            {
                if((*it)%v[j])
                  se.insert(v[j]*(*it));
            }
            se.insert(v[j]);
        }
        for(it=se.begin();it!=se.end();it++)
        {
            if(st[*it])
                ans+=num[*it];
            else
                ans-=num[*it];
            if(!in[ind])
                num[*it]++;
            else
                num[*it]--;
        }
        if(!in[ind]){
            if(a[ind]==1)
            {
                cout<<pre+co<<endl;
            pre=pre+co;
            }
            else{
            cout<<pre+co-ans<<endl;
            pre=pre+co-ans;}
            co++;
        }
        else{
            if(a[ind]==1)
            {
                cout<<pre-(co-1)<<endl;
            pre=pre-(co-1);
            }
            else{
            cout<<pre-(co-ans)<<endl;
             pre=pre-(co-ans);}
            co--;

        }
        in[ind]=!in[ind];

    }

  return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int ,int > ii;
int a[500005],fact[500000],num[500005],maxval=500005;
bool b[500005],st[500005],in[500005];
void build(){

    for(int i=1;i<=maxval;i++){
        b[i]=1;st[i]=1;}
    for(int i=2;i<=maxval;i++)
        if(!b[i])
            continue;
        else
        {
            fact[i]=i;
            if(i<sqrt(maxval+10))
            for(int j=i*i;j<=maxval;j+=i)
                if(b[j])
            {
                    st[j]=!st[i];
                fact[j]=i;
                b[j]=0;}
        }
}
int     main()
{
  //  freopen("in","r",stdin);
    int n,q,pre=0,co=0;
    build();
    cin>>n>>q;
    memset(num,0,sizeof num);
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=q;i++)
    {   int ind;
    set<int > se;
    set<int > ::iterator it;;
    vector<int > v;
        cin>>ind;
        int val=a[ind];
        while(val!=1){
            v.push_back(fact[val]);
            val/=fact[val];
        }
        int ans=0;
        for(int j=0;j<v.size();j++){
            for(it=se.begin();it!=se.end();it++)
            {
                if((*it)%v[j])
                  se.insert(v[j]*(*it));
            }
            se.insert(v[j]);
        }
        for(it=se.begin();it!=se.end();it++)
        {
            if(st[*it])
                ans+=num[*it];
            else
                ans-=num[*it];
            if(!in[ind])
                num[*it]++;
            else
                num[*it]--;
        }
        if(!in[ind]){
            cout<<pre+co-ans<<endl;
            pre=pre+co-ans;
            co++;
        }
        else{
            cout<<pre-(co-ans)+1<<endl;
             pre=pre-(co-ans)+1;
            co--;

        }
        in[ind]=!in[ind];

    }

  return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int ,int > ii;
int a[200005],fact[500000],num[500005],maxval=12;
bool b[500005],st[500005],in[500005];
void build(){

    for(int i=1;i<=maxval;i++){
        b[i]=1;st[i]=1;}
    for(int i=2;i<=maxval;i++)
        if(!b[i])
            continue;
        else
        {
            fact[i]=i;
            if(i<sqrt(maxval+10))
            for(int j=i*i;j<=maxval;j+=i)
                if(b[j])
            {
                    st[j]=!st[i];
                fact[j]=i;
                b[j]=0;}
        }
}
int     main()
{
  //  freopen("in","r",stdin);
    int n,q,pre=0,co=0;
    build();
    cin>>n>>q;
    for(int i=1;i<=n;i++)
        cin>>a[i];
    for(int i=1;i<=q;i++)
    {   int ind;
    set<int > se;
    set<int > ::iterator it;;
    vector<int > v;
        cin>>ind;
        int val=a[ind];
        while(val!=1){
            v.push_back(fact[val]);
            val/=fact[val];
        }
        int ans=0;
        for(int j=0;j<v.size();j++){
            for(it=se.begin();it!=se.end();it++)
            {
                if((*it)%v[j])
                  se.insert(v[j]*(*it));
            }
            se.insert(v[j]);
        }
        for(it=se.begin();it!=se.end();it++)
        {
            if(st[*it])
                ans+=num[*it];
            else
                ans-=num[*it];
            if(!in[ind])
                num[*it]++;
            else
                num[*it]--;
        }
        if(!in[ind]){
            cout<<pre+co-ans<<endl;
            pre=pre+co-ans;
            co++;
        }
        else{
            cout<<pre-(co-ans)+1<<endl;
             pre=pre-(co-ans);
            co--;

        }
        in[ind]=!in[ind];

    }

  return 0;
}


#include<bits/stdc++.h>
using namespace std;
typedef long long ll;
typedef pair<int ,int > ii;
int a[500005],fact[500000],num[500005],maxval=500005;
bool b[500005],st[500005],in[500005];
void build(){

    for(int i=1;i<=maxval;i++){
        b[i]=1;st[i]=1;}
    for(int i=2;i<=maxval;i++)
        if(!b[i])
            continue;
        else
        {
            fact[i]=i;
            if(i<sqrt(maxval+10))
            for(int j=i*i;j<=maxval;j+=i)
                if(b[j])
            {
                fact[j]=i;
                b[j]=0;}
        }
    st[1]=0;
    for(int i=2;i<=maxval;i++)
        st[i]=!st[i/fact[i]];
}
int     main()
{
    //freopen("in","r",stdin);
    int n,q,pre=0,co=0;
    build();
    cin>>n>>q;
    memset(num,0,sizeof num);
    memset(in,0,sizeof in);
    for(int i=1;i<=n;i++)
        cin>>a[i];

    for(int i=1;i<=q;i++)
    {   int ind;
    set<int > se;
    set<int > ::iterator it;;
    vector<int > v;
    cin>>ind;
        int val=a[ind];
        while(val!=1){
            v.push_back(fact[val]);
            val/=fact[val];
        }
        int ans=0;
        for(int j=0;j<v.size();j++){
            for(it=se.begin();it!=se.end();it++)
            {
                if((*it)%v[j])
                  se.insert(v[j]*(*it));
            }
            se.insert(v[j]);
        }
        for(it=se.begin();it!=se.end();it++)
        {
            int p=*it;
            if(st[*it])
                ans+=num[*it];
            else
                ans-=num[*it];
            if(!in[ind])
                num[*it]++;
            else
                num[*it]--;
        }
        if(!in[ind]){
            if(a[ind]==1)
            {
                cout<<pre+co<<endl;
            pre=pre+co;
            }
            else{
            cout<<pre+co-ans<<endl;
            pre=pre+co-ans;}
            co++;
        }
        else{
            if(a[ind]==1)
            {
                cout<<pre-(co-1)<<endl;
            pre=pre-(co-1);
            }
            else{
            cout<<pre-(co-ans)<<endl;
             pre=pre-(co-ans);}
            co--;

        }
        in[ind]=!in[ind];

    }

  return 0;
}