Advertisement
mehedi1

Modified RSQ for DCP-417

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