Problem p02763 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#include <cmath>
#include <iostream>
#include <string>
#include <unordered_map>
#include <unordered_set>
using namespace std;
#define ll long long
#define rep(i, n) for (ll i = 0; i < (n); i++)
#define FOR(i, a, b) for (ll i = (a); i < (b); i++)
#define FORR(i, a, b) for (ll i = (a); i <= (b); i++)
#define repR(i, n) for (ll i = n; i >= 0; i--)
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define F first
#define S second
#define pb push_back
#define pu push
#define COUT(x) cout << (x) << endl
#define PQ priority_queue<ll>
#define PQR priority_queue<ll, vector<ll>, greater<ll>>
#define YES(n) cout << ((n) ? "YES" : "NO") << endl
#define Yes(n) cout << ((n) ? "Yes" : "No") << endl
#define mp make_pair
#define maxs(x, y) (x = max(x, y))
#define mins(x, y) (x = min(x, y))
#define sz(x) (int)(x).size()
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const ll MOD = 1000000007LL;
const ll INF = 1LL << 60;
using vll = vector<ll>;
using vb = vector<bool>;
using vvb = vector<vb>;
using vvll = vector<vll>;
using vstr = vector<string>;
using pll = pair<ll, ll>;
using vc = vector<char>;
using vvc = vector<vc>;
ll dx[4] = {0, 1, 0, -1};
ll dy[4] = {1, 0, -1, 0};
int main() {
  ll n;
  string s;
  cin >> n >> s;
  ll q;
  cin >> q;
  vector<set<ll>> p(26);
  rep(i, n) { p[s[i] - 'a'].insert(i); }
  rep(i, q) {
    ll k;
    cin >> k;
    if (k == 1) {
      ll d;
      char r;
      cin >> d >> r;
      d--;
      p[s[d] - 'a'].erase(d);
      s[d] = r;
      p[s[d] - 'a'].insert(d);
    } else {
      ll l, r;
      cin >> l >> r;
      l--;
      ll ans = 0;
      rep(j, 26) {
        auto it = lower_bound(all(p[j]), l);
        if (it != p[j].end() && *it < r) {
          ans++;
        }
      }
      COUT(ans);
    }
  }
}


Fixed submission:
#include <bits/stdc++.h>
#include <cmath>
#include <iostream>
#include <string>
#include <unordered_map>
#include <unordered_set>
using namespace std;
#define ll long long
#define rep(i, n) for (ll i = 0; i < (n); i++)
#define FOR(i, a, b) for (ll i = (a); i < (b); i++)
#define FORR(i, a, b) for (ll i = (a); i <= (b); i++)
#define repR(i, n) for (ll i = n; i >= 0; i--)
#define all(v) (v).begin(), (v).end()
#define rall(v) (v).rbegin(), (v).rend()
#define F first
#define S second
#define pb push_back
#define pu push
#define COUT(x) cout << (x) << endl
#define PQ priority_queue<ll>
#define PQR priority_queue<ll, vector<ll>, greater<ll>>
#define YES(n) cout << ((n) ? "YES" : "NO") << endl
#define Yes(n) cout << ((n) ? "Yes" : "No") << endl
#define mp make_pair
#define maxs(x, y) (x = max(x, y))
#define mins(x, y) (x = min(x, y))
#define sz(x) (int)(x).size()
typedef pair<int, int> pii;
typedef pair<ll, ll> pll;
const ll MOD = 1000000007LL;
const ll INF = 1LL << 60;
using vll = vector<ll>;
using vb = vector<bool>;
using vvb = vector<vb>;
using vvll = vector<vll>;
using vstr = vector<string>;
using pll = pair<ll, ll>;
using vc = vector<char>;
using vvc = vector<vc>;
ll dx[4] = {0, 1, 0, -1};
ll dy[4] = {1, 0, -1, 0};
int main() {
  ll n;
  string s;
  cin >> n >> s;
  ll q;
  cin >> q;
  vector<set<ll>> p(26);
  rep(i, n) { p[s[i] - 'a'].insert(i); }
  rep(i, q) {
    ll k;
    cin >> k;
    if (k == 1) {
      ll d;
      char r;
      cin >> d >> r;
      d--;
      p[s[d] - 'a'].erase(d);
      s[d] = r;
      p[s[d] - 'a'].insert(d);
    } else {
      ll l, r;
      cin >> l >> r;
      l--;
      ll ans = 0;
      rep(j, 26) {
        auto it = p[j].lower_bound(l);
        if (it != p[j].end() && *it < r) {
          ans++;
        }
      }
      COUT(ans);
    }
  }
}