#include #include #include using namespace std; typedef pair Query; char S[2000005] = { '\0' }; char Supdate[2000005] = { '\0' }; long long QN = 0; Query qs[2000005] = {{0,0}}; long long leader[2000005] = { 0 }, ssize[2000005] = { 0 }, mem[2000005] = { 0 }; long long getLeader(long long l) { while (leader[l] != l) { leader[l] = leader[leader[l]]; l = leader[l]; } return l; } int main() { scanf("%s", S); scanf("%lld", &QN); for (long long i = 0; i < QN; i++) { Query qi = {0,0}; scanf("%lld %lld", &qi.first, &qi.second); qs[i] = qi; } strcpy(Supdate, S); // Fill Supdate for (long long i = 0; i < QN; i++) { if (qs[i].first == 1) continue; Supdate[qs[i].second] = '#'; } // cout << endl; // for (int i = 0; i = 0; i--) { if (qs[i].first == 2) { Supdate[qs[i].second] = S[qs[i].second]; if (qs[i].second > 0 && Supdate[qs[i].second - 1] == Supdate[qs[i].second]) { long long l = getLeader(qs[i].second - 1); leader[l] = qs[i].second; ssize[qs[i].second] += ssize[l]; } if (Supdate[qs[i].second] == Supdate[qs[i].second+1]) { long long l = getLeader(qs[i].second + 1); leader[l] = qs[i].second; ssize[qs[i].second] += ssize[l]; } } else { mem[mi++] = ssize[getLeader(qs[i].second)]; // cout << Supdate << endl; // for (int i = 0; i < 15; i++) // cout << leader[i] << " "; // cout << endl; // for (int i = 0; i < 15; i++) // cout << ssize[i] << " "; // cout << endl; // cout << qs[i].second << " " << leader[qs[i].second] << " " << ssize[qs[i].second] << endl; } } // Output while(--mi >= 0) printf("%lld\n", mem[mi]); }