#include<bits/stdc++.h> #define int long long #define ll long long using namespace std; const int N=2e5+5; const int M=998244353; int n, m; ll ksm(ll a,ll p){ll res=1; p%=(M-1);while(p){if(p&1){res=res*a%M;}a=a*a%M;p>>=1;}return res;} int sum[5][N*4]; int b[5][N]; int val[N]; const int dd = ksm(2, M-2); void pushup1(int id, int jin) { sum[jin][id] = (sum[jin][id << 1]+sum[jin][id<<1|1]+M)%M; } void build1(int id, int l, int r, int jin) { if (l == r) { sum[jin][id] = b[jin][l]%M; return; } int mid = (l + r) >> 1; build1(id << 1, l, mid, jin); build1(id << 1 | 1, mid + 1, r, jin); pushup1(id, jin); } void update1(int id, int l, int r, int x, int v, int jin) { if (l == r) { sum[jin][id] += v; return; } int mid = (l + r) >> 1; if (x <= mid) { update1(id << 1, l, mid, x, v, jin); } else { update1(id << 1 | 1, mid + 1, r, x, v, jin); } pushup1(id, jin); } int query1(int id, int l, int r, int x, int y, int jin) { if(x<=l&&r<=y) { return sum[jin][id]%M; } int mid=(l+r)>>1; int ans=0; if(x<=mid) { ans=(ans%M+query1(id<<1, l, mid, x, y,jin)%M)%M; } if(y>mid) { ans=(ans%M+query1(id<<1|1, mid+1, r, x, y,jin)%M)%M; } ans%=M; return ans; } signed main() { int n, q; cin>>n>>q; string s; cin>>s; val[n+1]=3; for (int i=n; i>=1; i--) { val[i]=val[i+1]*dd%M; b[s[i-1]-'0'][i]=val[i]; update1(1,1,n, i, val[i], s[i-1]-'0'); } while(q--) { int op, x, y; cin>>op>>x>>y; if (op==1) { update1(1,1,n, x, M-val[x], s[x-1]-'0'); update1(1,1,n, x, val[x], y); s[x-1]=y+'0'; }else { int ans1, ans2, ans3; ans1=ksm(dd, y-x+1)+((query1(1,1,n,x,y,1)+M)%M)*ksm(2, n-y); ans2=ksm(dd, y-x+1)+((query1(1,1,n,x,y,2)+M)%M)*ksm(2, n-y); ans3=ksm(dd, y-x+1)+((query1(1,1,n,x,y,3)+M)%M)*ksm(2, n-y); cout<<ans1%M<<' '<< ans2%M<<' '<< ans3%M<<endl; } } return 0; }
|