#include #include #include #include #include #include #include #include #include #include #include #include #include #include using namespace std; using ll=long long; #include using mint=atcoder::modint998244353; ostream& operator<<(ostream& os,const mint& x){ os<>(istream& is,mint& x){ int t; is>>t; x=t; return is; } template ostream& operator<<(ostream& os,const pair& p); template istream& operator>>(istream& is,pair& p); template ostream& operator<<(ostream& os,const array& arr); template istream& operator>>(istream& is,array& arr); template ostream& operator<<(ostream& os,const vector& vec); template istream& operator>>(istream& is,vector& vec); template ostream& operator<<(ostream& os,const pair& p){ os< istream& operator>>(istream& is,pair& p){ is>>p.first>>p.second; return is; } template ostream& operator<<(ostream& os,const array& arr){ for(int i=0;i istream& operator>>(istream& is,array& arr){ for(int i=0;i>arr[i]; return is; } template ostream& operator<<(ostream& os,const vector& vec){ for(int i=0;i<(int)vec.size();i++)os< istream& operator>>(istream& is,vector& vec){ for(int i=0;i<(int)vec.size();i++)is>>vec[i]; return is; } template void input_vec(Vecs&... vs) { const auto n = get<0>(tie(vs...)).size(); for (size_t i = 0; i < n; ++i) ((cin >> vs[i]), ...); } template void output_vec(const Vecs&... vs) { const auto n = get<0>(tie(vs...)).size(); for (size_t i = 0; i < n; ++i) { bool first = true; (((cout << (exchange(first, false) ? "" : " ") << vs[i])), ...); cout << endl; } } template vector make_unique(vector vec){ ranges::sort(vec); vec.erase(unique(vec.begin(),vec.end()),vec.end()); return vec; } vector Iota(int n,int s=0){ vector res(n); iota(res.begin(),res.end(),s); return res; } vector Iotall(int n,ll s=0){ vector res(n); iota(res.begin(),res.end(),s); return res; } void YESNO(bool f){ if(f)cout<<"Yes"<; using vvl=vector>; using vvvl=vector>>; using vi=vector; using vvi=vector>; using vvvi=vector>>; struct Combination{ Combination(int n){ init(n); } Combination(){}; private: int n; vector _fact,_factinv; void init(int n){ this->n=n; _fact.resize(n+1,1);_factinv.resize(n+1,1); for(int i=0;i=0;i--)_factinv[i]=_factinv[i+1]*(i+1); } public: mint fact(int x){ return _fact[x]; } mint factinv(int x){ return _factinv[x]; } mint C(int x,int y){ assert(0<=x&&x<=n&&0<=y); if(x(a-1,b) void down_binomsum_a(int& a,int& b,mint& c){ c-=comb.C(b,a-1); } //(a,b)->(a+1,b) void up_binomsum_a(int& a,int& b,mint& c){ c+=comb.C(b,a); } //(a,b)->(a,b-1) void down_binomsum_b(int& a,int& b,mint& c){ if(a!=0) c=(c+comb.C(b-1,a-1))*comb.frac(1,2); } //(a,b)->(a,b+1) void up_binomsum_b(int& a,int& b,mint& c){ if(a!=0) c=2*c-comb.C(b,a-1); } int main(){ cin.tie(nullptr); ios::sync_with_stdio(false); cout<>n>>q; string s; cin>>s; set ss; ss.insert(-1); int ng=0; mint ans=1; auto is_ng=[&](int i)->bool{ if(i==n-1){ return s[i-1]!=s[i]; } bool res=false; if(s[i-1]==s[i+1]&&s[i-1]!=s[i])res=true; if(s[i-1]!=s[i+1]&&s[i-1]!=s[i])res=true; return res; }; auto erase=[&](int i)->void{ ss.erase(i); auto itr=ss.upper_bound(i); if(itr!=ss.end()){ auto itr2=itr; itr2--; int len=(*itr)-(*itr2); len/=2; ans*=comb.C(2*len,len)*comb.frac(1,len+1); int len2=i-(*itr2),len3=(*itr)-i; len2/=2; len3/=2; ans*=comb.Cinv(2*len2,len2)*(len2+1); ans*=comb.Cinv(2*len3,len3)*(len3+1); }else{ itr--; int len=i-(*itr); len/=2; ans*=comb.Cinv(2*len,len)*(len+1); } }; auto add=[&](int i)->void{ auto itr=ss.lower_bound(i); if(itr!=ss.end()){ auto itr2=itr; itr2--; int len=(*itr)-(*itr2); len/=2; ans*=comb.Cinv(2*len,len)*(len+1); int len2=i-(*itr2),len3=(*itr)-i; len2/=2; len3/=2; ans*=comb.C(2*len2,len2)*comb.frac(1,len2+1); ans*=comb.C(2*len3,len3)*comb.frac(1,len3+1); }else{ itr--; int len=i-(*itr); len/=2; ans*=comb.C(2*len,len)*comb.frac(1,len+1); } ss.insert(i); }; for(int i=1;i>cmd; if(cmd==1){ int i; cin>>i; i--; if(i&1){ if(is_ng(i))ng--; if(i=n)continue; if(is_ng(j))ng--; if(j=n)continue; if(is_ng(j))ng++; if(j>k; if(n==1){ if((s[0]=='Y')==(k==0))cout<<1<0){ cout<<0<k||k-h>len){ cout<<0<=(n+1)/2&&k-h+1<=len)res-=comb.C(len,k-h+1); if(k<=n/2&&0<=k-h-1&&k-h-1<=len)res-=comb.C(len,k-h-1); cout<k||k-h>len){ cout<<0<=n/2&&k-h+1<=len)res-=comb.C(len,k-h+1); if(k