#include<iostream>#include<cstring>#include<cstdio>#include<queue>#include<cstdlib>#include<cmath>#include<stack>#include<map>#include<string>#include<vector>#include<algorithm>usingnamespace std;#define ll long long#define INF 0x3f3f3f3f#define endl '\n'constdouble pi =acos(-1);constint maxn =5e5+10;constint maxm =2e7+10;bool prime[maxm];int Prime[maxm];int phi[maxm];
ll a[maxn], c[maxn];int cnt, n, m, op;
ll Mod(ll x, ll y){return x > y ? x % y + y : x;}
ll ksm(ll a, ll b, ll c){
ll ans =1, base =Mod(a, c);while(b){if(b &1) ans =Mod(ans * base, c);
base =Mod(base * base, c);
b >>=1;}returnMod(ans, c);}intlowbit(int t){return t &(-t);}voidupdate(int x, ll k){for(int i = x ; i <= n ; i +=lowbit(i)) c[i]+= k;}voidadd(int l,int r, ll k){update(l, k);update(r +1,-k);}
ll ask(int x){
ll ans =0;for(int i = x ; i >0; i -=lowbit(i)){
ans += c[i];}return ans ;//+ sum[x];}voidmake(){
phi[1]=1;
prime[0]= prime[1]=true;for(int i =2; i < maxm ;++ i){if(!prime[i]){
Prime[++cnt]= i;
phi[i]= i -1;}for(ll j =1; j <= cnt && Prime[j]* i < maxm ;++ j){
prime[i * Prime[j]]=true;if(i % Prime[j]==0){
phi[i * Prime[j]]= phi[i]* Prime[j];break;}else phi[i * Prime[j]]= phi[i]* phi[Prime[j]];}}}
ll f(ll p,int l,int r){if(l == r || p ==1)returnMod(ask(l), p);returnksm(ask(l),f(phi[p], l +1, r), p);}intmain(){int l, r;
ll k, mod;make();scanf("%d %d",&n,&m);for(int i =1; i <= n ;++ i){scanf("%lld",&a[i]);}for(int i =1; i <= n ;++ i){update(i, a[i]- a[i-1]);//sum[i] = sum[i-1] + a[i];}for(int i =1; i <= m ;++ i){scanf("%d",&op);if(op ==1){scanf("%d %d %lld",&l,&r,&k);add(l, r, k);}if(op ==2){scanf("%d %d %lld",&l,&r,&mod);
cout <<f(mod, l, r)% mod << endl;}}return0;}