#include <bits/stdc++.h>
using namespace std;
 
template<typename T>
void out(T x) { cout << x << endl; exit(0); }
#define watch(x) cout << (#x) << " is " << (x) << endl
 
 
 
 
 
using ll = long long;
const ll mod = 1e9+7;
const int maxn = 1e5 + 5;
 
 
using matrix = vector<vector<ll>>;
 
void add(ll& x, ll y) {
    if (x>=mod) x%=mod;
    if (y>=mod) y%=mod;
    x += y;
    if (x>=mod) x%=mod;
}
 
void mul(ll& x, ll y) {
    if (x>=mod) x%=mod;
    if (y>=mod) y%=mod;
    long long tmp = 1ll*x*y;
    tmp %= mod;
    x = tmp;
}
 
ll addr(ll x, ll y) {
    if (x>=mod) x%=mod;
    if (y>=mod) y%=mod;
    x += y;
    if (x>=mod) x%=mod;
    return x;
}
 
ll mulr(ll x, ll y) {
    if (x>=mod) x%=mod;
    if (y>=mod) y%=mod;
    long long tmp = 1ll*x*y;
    tmp %= mod;
    return tmp;
}
 
 
 
matrix mul(matrix a, matrix b) {
    int n = a.size();
    assert(n>0);
    int m = a[0].size();
    assert(m == int(b.size()));
    int p = b[0].size();
    matrix res(n, vector<ll>(p));
    for (int i=0; i<n; i++) {
	for (int j=0; j<p; j++) {
	    for (int k=0; k<m; k++) {
		ll cur = mulr(a[i][k], b[k][j]);
		add(res[i][j], cur);
	    }
	}
    }
    return res;    
}
 
 
matrix matpw(matrix mat, int k) {
    int n = mat.size();
    assert(mat.size() && mat.size()==mat[0].size()); //nxn
    matrix res(n,vector<ll>(n));
    for (int i=0; i<n; i++) {
	res[i][i]=1;
    }
 
 
    while (k>0) {
	if (k%2) {
	    res=mul(res,mat);
	}
	mat=mul(mat,mat);
	k=k/2;
    }
 
    return res;
}
 
 
matrix id2() {
    vector<vector<ll>> mat(2,vector<ll>(2));
    mat[0][0]=mat[1][1]=1;
    return mat;
}
 
matrix matA() {
    vector<vector<ll>> mat(2,vector<ll>(2,1));
    mat[1][0]=0;
    // 1 1
    // 0 1
    return mat;
}
 
matrix matB() {
    vector<vector<ll>> mat(2,vector<ll>(2,1));
    mat[0][1]=0;
    // 1 0
    // 1 1
    return mat;
}
 
 
int n, q;
string s;
 
using node = matrix;
 
node t[4*maxn];
bool o[4*maxn];
 
node merge(node a, node b) {
    return mul(b, a);
}
 
void build(int v, int tl, int tr) {
    if (tl==tr) {
	t[v] = s[tl] == 'A' ? matA() : matB();
    } else {
	int tm=(tl+tr)/2;
	build(2*v,tl,tm);
	build(2*v+1,tm+1,tr);
	t[v] = merge(t[2*v], t[2*v+1]);
    }
}
 
void push(int v) {
    if (!o[v]) return;
    
    swap(t[2*v][0], t[2*v][1]);
    swap(t[2*v][0][0], t[2*v][0][1]);
    swap(t[2*v][1][0], t[2*v][1][1]);
 
    swap(t[2*v+1][0], t[2*v+1][1]);
    swap(t[2*v+1][0][0], t[2*v+1][0][1]);
    swap(t[2*v+1][1][0], t[2*v+1][1][1]);
    o[2*v]=!o[2*v];
    o[2*v+1]=!o[2*v+1];
    o[v]=false;
}
 
 
void flip(int v, int tl, int tr, int l, int  r) {
    if (r<tl || l>tr) {
	return;
    }
    if (l<=tl && tr<=r) {
	// before
	// p q
	// r s
 
	// after
	// s r
	// q p
	
	swap(t[v][0], t[v][1]);
	swap(t[v][0][0], t[v][0][1]);
	swap(t[v][1][0], t[v][1][1]);
	o[v] = !o[v];
	return;
    }
    int tm=(tl+tr)/2;
    push(v);
    flip(2*v,tl,tm,l,r);
    flip(2*v+1,tm+1,tr,l,r);
    t[v]=merge(t[2*v],t[2*v+1]);
}
 
matrix qry(int v, int tl, int tr, int l, int r) {
    if (l>tr || r<tl) {
	return id2();
    }
    if (l<=tl && tr<=r) {
	return t[v];
    }
    int tm=(tl+tr)/2;
    push(v);
    return mul(qry(2*v+1,tm+1,tr,l,r), qry(2*v,tl,tm,l,r));
}
 
 
 
 
int main() {
    ios_base::sync_with_stdio(false); cin.tie(0);  cout.tie(0);
 
    cin>>n>>q;
    cin>>s;
    s="."+s;
    build(1,1,n);
 
    while (q--) {
	int typ;
	cin>>typ;
	if (typ==2) {
	    int l,r; ll a,b;
	    cin>>l>>r>>a>>b;
	    matrix M = qry(1,1,n,l,r);
	    ll resa = addr(mulr(M[0][0],a), mulr(M[0][1],b));
	    ll resb = addr(mulr(M[1][0],a), mulr(M[1][1],b));
	    cout<<resa<<" "<<resb<<"\n";
	}
	if (typ==1) {
	    int l,r;
	    cin>>l>>r;
	    flip(1,1,n,l,r);
	}
    }
    
    
    return 0;
}