Advertisement
a53

switchLetters

a53
Aug 23rd, 2022
116
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
text 2.23 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2.  
  3. using namespace std;
  4.  
  5. ifstream fin("switchletters.in");
  6. ofstream fout("switchletters.out");
  7.  
  8. const int m = 1 << 17;
  9.  
  10. string s;
  11. char aint[4*m+5][27];
  12. char alfabet[] = "abcdefghijklmnopqrstuvwxyz";
  13. string ans;
  14.  
  15. struct queries {
  16. int st, dr;
  17. char t, tl;
  18. }quer[m+5];
  19.  
  20. struct events {
  21. int t, ind, tip;
  22. }event[2*m+5];
  23.  
  24. bool comp(events a, events b) {
  25. if(a.t != b.t) {
  26. return a.t < b.t;
  27. } else {
  28. if(a.tip > b.tip) {
  29. return true;
  30. } else {
  31. return false;
  32. }
  33. }
  34. }
  35.  
  36. void build(int nod, int st, int dr) {
  37. strcpy(aint[nod], alfabet);
  38. if(st == dr) {
  39. return;
  40. }
  41. int mid = (st + dr) / 2;
  42. build(2*nod, st, mid);
  43. build(2*nod+1, mid+1, dr);
  44. }
  45.  
  46. void compose(char *a, char *b, char *rez) {
  47. for(int i = 0; i < 26; i++) {
  48. rez[i] = b[a[i]-'a'];
  49. }
  50. }
  51.  
  52. void sw(int nod, int st, int dr, int pos, char c1, char c2) {
  53. if(st == dr) {
  54. strcpy(aint[nod], alfabet);
  55. aint[nod][c1-'a'] = c2;
  56. return;
  57. }
  58. int mid = (st + dr) / 2;
  59. if(pos <= mid) {
  60. sw(2*nod, st, mid, pos, c1, c2);
  61. } else {
  62. sw(2*nod+1, mid+1, dr, pos, c1, c2);
  63. }
  64. compose(aint[2*nod], aint[2*nod+1], aint[nod]);
  65. }
  66.  
  67. int main() {
  68. fin >> s;
  69. int q; fin >> q;
  70. build(1, 1, q);
  71. for(int i = 1; i <= q; i++) {
  72. fin >> quer[i].st >> quer[i].dr;
  73. fin >> quer[i].t >> quer[i].tl;
  74. event[2*i-1].ind = i;
  75. event[2*i-1].t = quer[i].st;
  76. event[2*i-1].tip = 1;
  77. event[2*i].ind = i;
  78. event[2*i].t = quer[i].dr+1;
  79. event[2*i+1].tip = -1;
  80. }
  81. sort(event+1, event+2*q+1, comp);
  82. for(int i = 0, j = 1; i < s.size(); i++) {
  83. while(j <= 2*q && event[j].t <= i) {
  84. if(event[j].tip == 1) {
  85. string abc = alfabet;
  86. abc[quer[event[j].ind].t-'a'] = quer[event[j].ind].tl;
  87. sw(1, 1, q, event[j].ind, quer[event[j].ind].t, quer[event[j].ind].tl);
  88. } else {
  89. sw(1, 1, q, event[j].ind, 'a', 'a');
  90. }
  91. j++;
  92. }
  93. ans += aint[1][s[i]-'a'];
  94. }
  95. fout << ans;
  96. return 0;
  97. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement