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

int phi(int n) {
	int res = n;
	for (int i = 2; i*i <= n; ++i)
		if (n % i == 0) {
			while (n % i == 0)
				n /= i;
			res -= res / i;
		}
	if (n > 1)
		res -= res / n;
	return res;
}

vector <int> factorize(int x) {
    vector <int> res;
    for (int i = 2; i*i <= x; ++i) {
        if (x%i == 0) {
            res.push_back(i);
        }
        while (x%i == 0) {
            x /= i;
        }
    }
    if (x > 1) res.push_back(x);
    return res;
}

#define fmod i_love_pelmeny

int mod;
vector <int> fmod;
const int N = (int)2e5+10;
vector <pair <int, int> > f[N];
vector <int> pw[25];
//vector <int> realpw[25];
int goodpart[N];
int inv[N];
int n, a[N];
int id[N];

int binpow(int a, int b) {
    int res = 1;
    while (b > 0) {
        if (b&1) res = 1ll*res*a%mod;
        b >>= 1;
        a = 1ll*a*a%mod;
    }
    return res;
}

struct node {
    vector <int> degrees;
    int tl, tr;
    int sum, here;
    bool flag = false;
    node *le, *ri;

    int calc_real_sum() {
//        if (!flag) return sum;
        int res = here;
        for (int i = 0; i < degrees.size(); ++i) {
            res = 1ll*res*pw[i][degrees[i]]%mod;
        }
        return res;
    }
    void push_down() {
        if (!flag) return;
        int i = 0;
        for (auto & x : degrees) {
            le->degrees[i] += x;
            ri->degrees[i] += x;

            le->sum = 1ll*le->sum*pw[i][x]%mod;
            ri->sum = 1ll*ri->sum*pw[i][x]%mod;

            x = 0;
            ++i;
        }
        le->here = 1ll*le->here*here%mod;
        le->sum = 1ll*le->sum*here%mod;
        ri->here = 1ll*ri->here*here%mod;
        ri->sum = 1ll*ri->sum*here%mod;
        here = 1;
        flag = false;
        le->flag = ri->flag = true;
    }
    void combine() {
        sum = (le->sum+ri->sum)%mod;
    }

    void multiply(int l, int r, int x) {
        if (r < tl || tr < l) return;
        if (l <= tl && tr <= r) {
            flag = true;
            for (auto p : f[x]) {
                degrees[id[p.first]-1] += p.second;
            }
            here = 1ll*here*goodpart[x]%mod;
            sum = 1ll*sum*x%mod;
            return;
        }
        push_down();
        le->multiply(l, r, x);
        ri->multiply(l, r, x);
        combine();
    }
    void divide(int pos, int x) {
        if (tl == tr) {
            for (auto p : f[x]) {
                degrees[id[p.first]-1] -= p.second;
            }
            here = 1ll*here*inv[goodpart[x]]%mod;
            sum = calc_real_sum();
            return;
        }
        push_down();
        if (pos <= (tl+tr)/2) {
            le->divide(pos, x);
        } else {
            ri->divide(pos, x);
        }
        combine();
    }
    int get(int l, int r) {
        if (r < tl || tr < l) {
            return 0;
        }
        if (l <= tl && tr <= r) {
            return sum;
        }
        push_down();
        return (le->get(l, r)+ri->get(l, r))%mod;
    }
    node(int l, int r, int dsize) {
        tl = l;
        tr = r;
        sum = 1;
        here = 1;
        degrees.resize(dsize);
        if (l == r) {
            multiply(l, r, a[l]);
            return;
        }
        le = new node(l, (l+r)/2, dsize);
        ri = new node((l+r)/2+1, r, dsize);
        combine();
    }
};

struct query {
    int x, l, r, t;
    query() {}
};

node *t;
vector <query> q;

void precalc_base() {
    fmod = factorize(mod);
    if (fmod.back() >= N) fmod.pop_back();
    vector <int> deg(N);
    for (int i = 0; i < fmod.size(); ++i) {
        id[fmod[i]] = i+1;
        for (int j = fmod[i]; j < N; j += fmod[i]) {
            if ((j/fmod[i])%fmod[i]) {
                deg[j] = 1;
            } else {
                deg[j] = deg[j/fmod[i]]+1;
            }
            f[j].emplace_back(fmod[i], deg[j]);
        }
    }

    for (int i = 1; i < N; ++i) {
        goodpart[i] = i;
        goodpart[i] = goodpart[i/__gcd(i, mod)];
    }
}
void precalc_inverse() {
    vector <int> mn(N);
    for (int i = 2; i < N; ++i) {
        if (mn[i]) continue;
        for (int j = i+i; j < N; j += i) {
            if (!mn[j]) mn[j] = i;
        }
    }

    int mod_phi = phi(mod);
    inv[1] = 1;
    for (int i = 2; i < N; ++i) {
        if (!mn[i]) inv[i] = binpow(i, mod_phi-1);
        else inv[i] = 1ll*inv[i/mn[i]]*inv[mn[i]]%mod;
    }
}
void precalc_powers() {
    vector <int> max_entry(fmod.size());
    for (int i = 1; i <= n; ++i) {
        for (auto p : f[a[i]]) {
            max_entry[id[p.first]-1] += p.second;
        }
    }

    for (const auto& w : q) {
        if (w.t != 1) continue;
        for (auto p : f[w.x]) {
            max_entry[id[p.first]-1] += p.second;
        }
    }

    for (int i = 0; i < fmod.size(); ++i) {
        pw[i].resize(max_entry[i]+1);
        pw[i][0] = 1;
        for (int j = 1; j < pw[i].size(); ++j) {
            pw[i][j] = 1ll*pw[i][j-1]*fmod[i]%mod;
        }
    }

}
void precalc() {
    precalc_base();
    precalc_inverse();
    precalc_powers();
    t = new node(1, n, fmod.size());
    cerr << 1.0*clock()/CLOCKS_PER_SEC << endl;
}

int main() {
//    ios_base::sync_with_stdio(0);
    #ifdef LOCAL
    freopen("input.txt", "r", stdin);
    freopen("output.txt", "w", stdout);
    #endif // LOCAL
    scanf("%d%d", &n, &mod);
    for (int i = 1; i <= n; ++i) {
        scanf("%d", &a[i]);
    }
    int m; scanf("%d", &m);
    q.resize(m);
    for (int i = 0; i < m; ++i) {
        scanf("%d", &q[i].t);
        scanf("%d", &q[i].l);
        if (q[i].t != 2)
            scanf("%d", &q[i].r);
        if (q[i].t != 3)
            scanf("%d", &q[i].x);
    }
    precalc();
    for (const auto& p : q) {
        if (p.t == 1) {
            t->multiply(p.l, p.r, p.x);
        }
        if (p.t == 2) {
            t->divide(p.l, p.x);
        }
        if (p.t == 3) {
            printf("%d\n", t->get(p.l, p.r));
        }
    }

}
