Problem p02763 (C++)

Buggy submission (status: Time Limit Exceeded):
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define sz(x) int(x.size())
using namespace std;
typedef long long ll;
typedef pair<int, int> P;

const ll INF = 1LL << 60;

ll N, Q;
string S;

// map<int, set<ll>> mp;
vector<set<int>> mp(26);

int main() {
  // set<ll> v = {2, 4, 5, 7};
  // auto it = v.lower_bound(5);
  // cout << *it << endl;
  // v.erase(it);
  // rep(i, v.size()) {
  //     cout << v[i] << " ";
  // }
  // return 0;

  cin >> N >> S >> Q;

  rep(i, S.size()) { mp[S[i] - 'a'].insert(i); }

  // cout << (upper_bound(v.begin(), v.end(), 5) - v.begin()) -
  // (lower_bound(v.begin(), v.end(), 4) - v.begin()) << endl; for (auto m : mp)
  // {
  //     cout << m.first << endl;
  //     cout << "  ";
  //     for (auto s : m.second) {
  //         cout << s << " ";
  //     }
  //     cout << endl;
  // }

  rep(k, Q) {
    ll t;
    cin >> t;
    if (t == 1) {
      ll i;
      char c;
      cin >> i >> c;
      i--;

      // // idx 消す
      // for (int j = 0; j < 26; j++) {
      //     set<ll> target = mp[j];
      //     // auto idx = find(target.begin(), target.end(), i);
      //     if (target.count(i)) {
      //         // cout << "erase" << endl;
      //         // cout << *idx << endl;
      //         target.erase(i);
      //         mp[j] = target;
      //         break;
      //     }
      // }
      // i文字めを消す
      mp[S[i] - 'a'].erase(i);
      S[i] = c;

      // idx 挿入
      mp[c - 'a'].insert(i);
    } else {
      ll l, r;
      cin >> l >> r;
      l--;
      r--;
      ll ans = 0;
      for (int j = 0; j < 26; j++) {
        set<int> s = mp[j];
        auto it = s.lower_bound(l);
        if (it != s.end() && *it <= r) {
          ans++;
        };
        // ll tmp = (upper_bound(v.begin(), v.end(), r) - v.begin()) -
        // (lower_bound(v.begin(), v.end(), l) - v.begin()); if (tmp > 0) {
        //    ans++;
        // }
      }
      cout << ans << endl;
    }
  }

  // for (auto m : mp) {
  //     cout << m.first << endl;
  //     cout << "  ";
  //     for (auto s : m.second) {
  //         cout << s << " ";
  //     }
  //     cout << endl;
  // }
}

Fixed submission:
#include <bits/stdc++.h>
#define rep(i, n) for (int i = 0; i < (n); ++i)
#define sz(x) int(x.size())
using namespace std;
typedef long long ll;
typedef pair<int, int> P;

const ll INF = 1LL << 60;

ll N, Q;
string S;

// map<int, set<ll>> mp;
vector<set<int>> mp(26);

int main() {
  // set<ll> v = {2, 4, 5, 7};
  // auto it = v.lower_bound(5);
  // cout << *it << endl;
  // v.erase(it);
  // rep(i, v.size()) {
  //     cout << v[i] << " ";
  // }
  // return 0;

  cin >> N >> S >> Q;

  rep(i, S.size()) { mp[S[i] - 'a'].insert(i); }

  // cout << (upper_bound(v.begin(), v.end(), 5) - v.begin()) -
  // (lower_bound(v.begin(), v.end(), 4) - v.begin()) << endl; for (auto m : mp)
  // {
  //     cout << m.first << endl;
  //     cout << "  ";
  //     for (auto s : m.second) {
  //         cout << s << " ";
  //     }
  //     cout << endl;
  // }

  rep(k, Q) {
    ll t;
    cin >> t;
    if (t == 1) {
      ll i;
      char c;
      cin >> i >> c;
      i--;

      // // idx 消す
      // for (int j = 0; j < 26; j++) {
      //     set<ll> target = mp[j];
      //     // auto idx = find(target.begin(), target.end(), i);
      //     if (target.count(i)) {
      //         // cout << "erase" << endl;
      //         // cout << *idx << endl;
      //         target.erase(i);
      //         mp[j] = target;
      //         break;
      //     }
      // }
      // i文字めを消す
      mp[S[i] - 'a'].erase(i);
      S[i] = c;

      // idx 挿入
      mp[c - 'a'].insert(i);
    } else {
      ll l, r;
      cin >> l >> r;
      l--;
      r--;
      ll ans = 0;
      for (int j = 0; j < 26; j++) {
        auto it = mp[j].lower_bound(l);
        if (it != mp[j].end() && *it <= r) {
          ans++;
        };
        // ll tmp = (upper_bound(v.begin(), v.end(), r) - v.begin()) -
        // (lower_bound(v.begin(), v.end(), l) - v.begin()); if (tmp > 0) {
        //    ans++;
        // }
      }
      cout << ans << endl;
    }
  }

  // for (auto m : mp) {
  //     cout << m.first << endl;
  //     cout << "  ";
  //     for (auto s : m.second) {
  //         cout << s << " ";
  //     }
  //     cout << endl;
  // }
}