Submission #270519

#TimeUsernameProblemLanguageResultExecution timeMemory
270519eohomegrownappsLucky Numbers (RMI19_lucky)C++14
100 / 100
160 ms35704 KiB
#include <bits/stdc++.h> using namespace std; typedef long long ll; typedef vector<vector<ll>> Data; int arr[100000]; ll m = 1000000007; void init(int ind, ll ans[4][4]){ //Data ans = vector<vector<ll>>(4,vector<ll>(4,0)); for (int x = 0; x<4; x++){ for (int y = 0; y<4; y++){ ans[x][y]=0; } bool isEq = x/2; bool was1 = x%2; for (int i = 0; i<=(isEq?arr[ind]:9); i++){ if (was1 && i==3){continue;} ans[x][(i==arr[ind]&&isEq)*2+(i==1)]++; } } //return ans; } void combine(ll a[4][4], ll b[4][4], ll ans[4][4]){ //Data ans = vector<vector<ll>>(4,vector<ll>(4,0)); for (int r = 0; r<4; r++){ for (int c = 0; c<4; c++){ ans[r][c]=0; ans[r][c]+=a[r][0]*b[0][c];ans[r][c]%=m; ans[r][c]+=a[r][1]*b[1][c];ans[r][c]%=m; ans[r][c]+=a[r][2]*b[2][c];ans[r][c]%=m; ans[r][c]+=a[r][3]*b[3][c];ans[r][c]%=m; //cout<<ans[r][c]<<' '; }//cout<<'\n'; }//cout<<'\n'; //return ans; } struct Node{ int s,e,m; ll v[4][4]; Node *l, *r; Node(int _s, int _e){ s=_s;e=_e; m=(s+e)/2; if (s==e){ init(s,v); return; } l = new Node(s,m); r = new Node(m+1,e); combine(l->v, r->v, v); } void update(int ind, int val){ if (s==e){ arr[ind]=val; init(ind,v); return; } if (ind<=m){ l->update(ind, val); } else { r->update(ind, val); } combine(l->v, r->v, v); } void query(int a, int b, ll ans[4][4]){ if (s==a&&e==b){ for (int x = 0; x<4; x++){ for (int y = 0; y<4; y++){ ans[x][y]=v[x][y]; } } return; //return v; } if (b<=m){ l->query(a,b,ans); return; } else if (m<a){ r->query(a,b,ans); return; } else { ll av[4][4]; ll bv[4][4]; l->query(a,m,av); r->query(m+1,b,bv); combine(av,bv,ans); } } }; Node *root; ll ans(int a, int b){ ll ad[4][4]; root->query(a,b,ad); return (ad[2][0]+ad[2][1]+ad[2][2]+ad[2][3])%m; } int main(){ cin.tie(0); ios_base::sync_with_stdio(0); int n,q; cin>>n>>q; string s; cin>>s; for (int i = 0; i<n; i++){ arr[i]=s[i]-'0'; } root = new Node(0,n-1); cout<<ans(0,n-1)<<'\n'; for (int i = 0; i<q; i++){ int t; cin>>t; if (t==1){ int a,b; cin>>a>>b; a--;b--; cout<<ans(a,b)<<'\n'; } else { int ind,val; cin>>ind>>val; ind--; root->update(ind,val); } } }
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...
#Verdict Execution timeMemoryGrader output
Fetching results...