fork download
  1.  
  2. import java.io.*;
  3.  
  4. public class Main {
  5.  
  6. static class EntradaRapida {
  7. private final BufferedInputStream flujo =
  8.  
  9. private final byte[] buffer = new byte[1 << 16];
  10. private int indice = 0;
  11. private int limite = 0;
  12.  
  13. private int leer() throws IOException {
  14. if (indice == limite) {
  15. limite = flujo.read(buffer);
  16. indice = 0;
  17.  
  18. if (limite <= 0) return -1;
  19. }
  20.  
  21. return buffer[indice++];
  22. }
  23.  
  24. int leerEntero() throws IOException {
  25. int caracter;
  26.  
  27. do {
  28. caracter = leer();
  29. if (caracter == -1) return -1;
  30. } while (caracter <= 32);
  31.  
  32. int numero = 0;
  33.  
  34. while (caracter > 32) {
  35. numero = numero * 10 + caracter - '0';
  36. caracter = leer();
  37. }
  38.  
  39. return numero;
  40. }
  41.  
  42. String leerCadena() throws IOException {
  43. StringBuilder texto = new StringBuilder();
  44. int caracter;
  45.  
  46. do {
  47. caracter = leer();
  48. if (caracter == -1) return null;
  49. } while (caracter <= 32);
  50.  
  51. while (caracter > 32) {
  52. texto.append((char) caracter);
  53. caracter = leer();
  54. }
  55.  
  56. return texto.toString();
  57. }
  58.  
  59. char leerLetra() throws IOException {
  60. int caracter;
  61.  
  62. do {
  63. caracter = leer();
  64. } while (caracter <= 32 && caracter != -1);
  65.  
  66. return (char) caracter;
  67. }
  68. }
  69.  
  70. static class ArbolSegmentos {
  71. private final int base;
  72. private final int[] arbol;
  73.  
  74. ArbolSegmentos(char[] cadena) {
  75. int tamano = cadena.length;
  76.  
  77. int potencia = 1;
  78.  
  79. while (potencia < tamano) {
  80. potencia <<= 1;
  81. }
  82.  
  83. base = potencia;
  84. arbol = new int[base << 1];
  85.  
  86. construir(cadena);
  87. }
  88.  
  89. private void construir(char[] cadena) {
  90. for (int i = 0; i < cadena.length; i++) {
  91. arbol[base + i] = 1 << (cadena[i] - 'a');
  92. }
  93.  
  94. for (int i = base - 1; i > 0; i--) {
  95. arbol[i] = arbol[i << 1] |
  96. arbol[i << 1 | 1];
  97. }
  98. }
  99.  
  100. void actualizar(int posicion, char letra) {
  101. int nodo = base + posicion;
  102.  
  103. arbol[nodo] = 1 << (letra - 'a');
  104.  
  105. for (nodo >>= 1; nodo > 0; nodo >>= 1) {
  106. arbol[nodo] = arbol[nodo << 1] |
  107. arbol[nodo << 1 | 1];
  108. }
  109. }
  110.  
  111. int consultar(int izquierda, int derecha) {
  112. int mascara = 0;
  113.  
  114. izquierda += base;
  115. derecha += base + 1;
  116.  
  117. while (izquierda < derecha) {
  118.  
  119. if ((izquierda & 1) != 0) {
  120. mascara |= arbol[izquierda++];
  121. }
  122.  
  123. if ((derecha & 1) != 0) {
  124. mascara |= arbol[--derecha];
  125. }
  126.  
  127. izquierda >>= 1;
  128. derecha >>= 1;
  129. }
  130.  
  131. return Integer.bitCount(mascara);
  132. }
  133. }
  134.  
  135. static void resolver(EntradaRapida lector) throws IOException {
  136.  
  137. String entrada = lector.leerCadena();
  138.  
  139. if (entrada == null) return;
  140.  
  141. char[] cadena = entrada.toCharArray();
  142.  
  143. int cantConsultas = lector.leerEntero();
  144.  
  145. ArbolSegmentos arbol = new ArbolSegmentos(cadena);
  146.  
  147. StringBuilder resultado = new StringBuilder();
  148.  
  149. for (int i = 0; i < cantConsultas; i++) {
  150.  
  151. int tipo = lector.leerEntero();
  152.  
  153. if (tipo == 1) {
  154.  
  155. int posicion = lector.leerEntero() - 1;
  156. char letra = lector.leerLetra();
  157.  
  158. if (cadena[posicion] != letra) {
  159. cadena[posicion] = letra;
  160. arbol.actualizar(posicion, letra);
  161. }
  162.  
  163. } else {
  164.  
  165. int izquierda = lector.leerEntero() - 1;
  166. int derecha = lector.leerEntero() - 1;
  167.  
  168. resultado.append(
  169. arbol.consultar(izquierda, derecha)
  170. ).append('\n');
  171. }
  172. }
  173.  
  174. System.out.print(resultado);
  175. }
  176.  
  177. public static void main(String[] args) throws IOException {
  178. resolver(new EntradaRapida());
  179. }
  180. }
Success #stdin #stdout 0.07s 54756KB
stdin
Standard input is empty
stdout
Standard output is empty