Advertisement
mehedi1

Untitled

Jul 26th, 2019
129
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 1.56 KB | None | 0 0
  1. #include<bits/stdc++.h>
  2. using namespace std;
  3. #define mxn 100005
  4. #define ll long long
  5. int st[mxn*4][30];
  6. char s[mxn], tmp[mxn], prev[2];
  7.  
  8. void build(int v, int l, int r) {
  9.     if(l==r) {
  10.         st[v][s[l]-'a'] = 1;
  11.     } else {
  12.         int m = (l+r)/2;
  13.         build(v*2, l, m);
  14.         build(v*2+1, m+1, r);
  15.         for(int i=0;i<26;++i) {
  16.             st[v][i] = st[v*2][i] + st[v*2+1][i];
  17.         }
  18.     }
  19. }
  20. void update(int v, int l, int r, int id, char s1[]) {
  21.     if(l==r) {
  22.         st[v][s[id]-'a']=0;
  23.         st[v][s1[0]-'a']=1;
  24.         return;
  25.     }
  26.     int m = (l+r)/2;
  27.     if(id<=m) update(v*2, l, m, id, s1);
  28.     else update(v*2+1, m+1, r, id, s1);
  29.     for(int i=0;i<26;++i) {
  30.         st[v][i] = st[v*2][i] + st[v*2+1][i];
  31.     }
  32.     //st[v][s1[0]-'a'] = st[v*2][s1[0]-'a'] + st[v*2+1][s1[0]-'a'];
  33. }
  34. int query(int v, int l, int r, int i, int j, char s1[]) {
  35.     if(l>=i && r<=j) return st[v][s1[0]-'a'];
  36.     int m = (l+r)/2;
  37.     if(j<=m) return query(v*2, l, m, i, j, s1);
  38.     else if(i>m) return query(v*2+1, m+1, r, i, j, s1);
  39.     else return query(v*2, l, m, i, m,s1) + query(v*2+1, m+1, r, m+1, j,s1);
  40. }
  41. int main() {
  42.     int q, ck, id, a, x, y;
  43.     char s1[2];
  44.     scanf("%s",tmp);
  45.     int n = strlen(tmp);
  46.     for(int i=0;i<n;++i) s[i+1] = tmp[i];
  47.     for(int i=1;i<=n;++i) putchar(s[i]);
  48.     build(1,1,n);
  49.     scanf("%d",&q);
  50.     while(q--) {
  51.         scanf("%d",&ck);
  52.         if(ck==1) {
  53.             scanf("%d %s",&id,s1);
  54.             id++;
  55.             //prev[0] = s[id];
  56.             update(1, 1, n, id, s1);
  57.         }
  58.         else {
  59.             scanf("%s %d %d",s1,&x,&y);
  60.             x++, y++;
  61.             int res = query(1,1,n,x,y,s1);
  62.             printf("%d\n", res);
  63.         }
  64.     }
  65.     return 0;
  66. }
  67.  
  68. /*
  69. admission
  70. 7
  71. 2 s 0 8
  72. 2 i 2 7
  73. 1 2 s
  74. 2 s 2 5
  75. 2 o 0 5
  76. */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement