Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <bits/stdc++.h>
- using namespace std;
- int maxn = 1000090;
- int t[1000090],b[1000090][10],l1[1000090];
- void recalc(int v){
- int h=l1[v]%10;
- if (v*2<maxn) l1[v*2]+=l1[v];
- if (v*2+1<maxn) l1[v*2+1]+=l1[v];
- l1[v]=0;
- if(h==0)return;
- t[v]=0;
- int newB[10];
- for(int i=0;i<10;i++){
- newB[(i+h)%10]=b[v][i];
- }
- for(int i=0;i<10;i++){
- b[v][i]=newB[i];
- t[v]+=(b[v][i]*i);
- }
- }
- void build (vector<int> &a, int v, int tl, int tr) {
- if (tl == tr){
- t[v]=a[tl];
- b[v][a[tl]]=1;
- }
- else {
- int tm = (tl + tr) / 2;
- build (a, v*2, tl, tm);
- build (a, v*2+1, tm+1, tr);
- t[v] = t[v*2] + t[v*2+1];
- for(int i=0;i<10;i++)b[v][i] = b[v*2][i] + b[v*2+1][i];
- }
- }
- void update(int v, int tl, int tr, int l, int r){
- recalc(v);
- if (l > r)
- return;
- if (l == tl && r == tr){
- l1[v]+=1;
- recalc(v);
- return;
- }
- if(l1[v]>0)recalc(v);
- int tm = (tl + tr) / 2;
- update(v*2, tl, tm, l, min(r,tm));
- update(v*2+1, tm+1, tr, max(l,tm+1), r);
- t[v] = t[v*2] + t[v*2+1];
- for(int i=0;i<10;i++)b[v][i] = b[v*2][i] + b[v*2+1][i];
- return;
- }
- int sum (int v, int tl, int tr, int l, int r) {
- recalc(v);
- if (l > r)
- return 0;
- if (l == tl && r == tr){
- recalc(v);
- return t[v];
- }
- recalc(v);
- int tm = (tl + tr) / 2;
- return sum (v*2, tl, tm, l, min(r,tm))
- + sum (v*2+1, tm+1, tr, max(l,tm+1), r);
- }
- int main() {
- for(int i=0;i<1000090;i++)l1[i]=0;
- int n,m;
- cin>>n>>m;
- char c;
- vector<int> a(n);
- for(int i=0;i<n;i++){
- cin>>c;
- a[i]=(int)c-48;
- }
- build(a,1,0,n-1);
- int l,r;
- for(int i=0;i<m;i++){
- cin>>l>>r;
- int ans = sum(1,0,n-1,l-1,r-1);
- cout << ans << '\n';
- update(1,0,n-1,l-1,r-1);
- for (int i = 0; i<n; i++){
- cout << sum(1, 0, n-1, i, i) << " ";
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement