Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- #define mxn 100005
- #define ll long long
- int st[mxn*4][30];
- char s[mxn], tmp[mxn], prev[2];
- void build(int v, int l, int r) {
- if(l==r) {
- st[v][s[l]-'a'] = 1;
- } else {
- int m = (l+r)/2;
- build(v*2, l, m);
- build(v*2+1, m+1, r);
- for(int i=0;i<26;++i) {
- st[v][i] = st[v*2][i] + st[v*2+1][i];
- }
- }
- }
- void update(int v, int l, int r, int id, char s1[]) {
- if(l==r) {
- st[v][s[id]-'a']=0;
- st[v][s1[0]-'a']=1;
- return;
- }
- int m = (l+r)/2;
- if(id<=m) update(v*2, l, m, id, s1);
- else update(v*2+1, m+1, r, id, s1);
- for(int i=0;i<26;++i) {
- st[v][i] = st[v*2][i] + st[v*2+1][i];
- }
- //st[v][s1[0]-'a'] = st[v*2][s1[0]-'a'] + st[v*2+1][s1[0]-'a'];
- }
- int query(int v, int l, int r, int i, int j, char s1[]) {
- if(l>=i && r<=j) return st[v][s1[0]-'a'];
- int m = (l+r)/2;
- if(j<=m) return query(v*2, l, m, i, j, s1);
- else if(i>m) return query(v*2+1, m+1, r, i, j, s1);
- else return query(v*2, l, m, i, m,s1) + query(v*2+1, m+1, r, m+1, j,s1);
- }
- int main() {
- int q, ck, id, a, x, y;
- char s1[2];
- scanf("%s",tmp);
- int n = strlen(tmp);
- for(int i=0;i<n;++i) s[i+1] = tmp[i];
- for(int i=1;i<=n;++i) putchar(s[i]);
- build(1,1,n);
- scanf("%d",&q);
- while(q--) {
- scanf("%d",&ck);
- if(ck==1) {
- scanf("%d %s",&id,s1);
- id++;
- //prev[0] = s[id];
- update(1, 1, n, id, s1);
- }
- else {
- scanf("%s %d %d",s1,&x,&y);
- x++, y++;
- int res = query(1,1,n,x,y,s1);
- printf("%d\n", res);
- }
- }
- return 0;
- }
- /*
- admission
- 7
- 2 s 0 8
- 2 i 2 7
- 1 2 s
- 2 s 2 5
- 2 o 0 5
- */
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement