fork download
  1. #include <bits/stdc++.h>
  2.  
  3.  
  4. using namespace std;
  5.  
  6.  
  7. int n, x_val, q;
  8. int a[2000005];
  9. int BIT[2000005];
  10.  
  11.  
  12. int lowbit(int i) {
  13. return i & (-i);
  14. }
  15.  
  16.  
  17. void modify(int i, int val) {
  18. for (; i <= n; i += lowbit(i)) BIT[i] += val;
  19. }
  20.  
  21.  
  22. int query(int i) {
  23. int sum = 0;
  24. for (; i > 0; i -= lowbit(i)) sum += BIT[i];
  25. return sum;
  26. }
  27.  
  28.  
  29. int main() {
  30. ios_base::sync_with_stdio(false);
  31. cin.tie(NULL);
  32.  
  33.  
  34. cin >> n >> x_val;
  35. for (int i = 1; i <= n; i++) {
  36. cin >> a[i];
  37. if (a[i] == x_val) modify(i, 1); // Đánh dấu nếu là x
  38. }
  39.  
  40.  
  41. cin >> q;
  42. while (q--) {
  43. int type;
  44. cin >> type;
  45. if (type == 1) {
  46. int l, r, k;
  47. cin >> l >> r >> k;
  48.  
  49. int s_before = query(l - 1);
  50. int target = s_before + k;
  51.  
  52. // Kiểm tra xem trong đoạn [1, r] có đủ target số x không
  53. if (query(r) < target) {
  54. cout << -1 << "\n";
  55. } else {
  56. // Chặt nhị phân tìm vị trí nhỏ nhất đạt được target
  57. int low = l, high = r, ans = -1;
  58. while (low <= high) {
  59. int mid = low + (high - low) / 2;
  60. if (query(mid) >= target) {
  61. ans = mid;
  62. high = mid - 1;
  63. } else {
  64. low = mid + 1;
  65. }
  66. }
  67. cout << ans << "\n";
  68. }
  69. } else {
  70. int idx, v;
  71. cin >> idx >> v;
  72. if (a[idx] == x_val && v != x_val) modify(idx, -1);
  73. else if (a[idx] != x_val && v == x_val) modify(idx, 1);
  74. a[idx] = v;
  75. }
  76. }
  77. return 0;
  78. }
  79.  
Success #stdin #stdout 0.01s 5284KB
stdin
Standard input is empty
stdout
Standard output is empty