#include #define y1 dmytxdy #define fi first #define se second #define mp make_pair using namespace std; typedef long long ll; typedef unsigned long long ull; typedef pair pii; typedef pair pll; bool chkmax(int &x,int y){return xy?x=y,true:false;} int readint(){ int x=0,f=1; char ch=getchar(); while(ch<'0'||ch>'9'){if(ch=='-')f=-1;ch=getchar();} while(ch>='0'&&ch<='9'){x=x*10+ch-'0';ch=getchar();} return x*f; } const int cys=998244353; int n,m,q; char s[1000005]; ll val[3000000]; ll mod(ll x){return x>=cys?x-cys:x;} void build(int id,int l,int r){ if(l==r) return (void)(val[id]=l); int mid=(l+r)/2; build(id<<1,l,mid); build(id<<1|1,mid+1,r); val[id]=s[id]=='0'?mod(val[id<<1]+val[id<<1|1]):val[id<<1]*val[id<<1|1]%cys; } void change(int id,int l,int r,int x,ll c){ if(l==r) return (void)(val[id]=c); int mid=(l+r)/2; if(x<=mid) change(id<<1,l,mid,x,c); else change(id<<1|1,mid+1,r,x,c); val[id]=s[id]=='0'?mod(val[id<<1]+val[id<<1|1]):val[id<<1]*val[id<<1|1]%cys; } ll query(int id,int l,int r,int x){ if(l==r) return 1; int mid=(l+r)/2; if(x<=mid) return query(id<<1,l,mid,x)*(s[id]=='0'?1:val[id<<1|1])%cys; else return query(id<<1|1,mid+1,r,x)*(s[id]=='0'?1:val[id<<1])%cys; } int main(){ m=readint(); q=readint(); n=1<<(m-1); scanf("%s",s+1); build(1,1,1<<(m-1)); int opt,x; while(q--){ opt=readint(); x=readint(); if(opt==1) change(1,1,n,x,readint()); else printf("%I64d\n",query(1,1,n,x)); } return 0; }