Guest User

c.cpp

a guest
Nov 19th, 2025
53
0
Never
5
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.53 KB | None | 0 0
  1. #pragma comment(linker, "/stack:2000000")
  2. #pragma GCC optimize("Ofast")
  3. #pragma GCC target("sse,sse2,sse3,ssse3,sse4,popcnt,abm,mmx")
  4.  
  5. #include <bits/stdc++.h>
  6.  
  7. #define mp make_pair
  8. #define pb push_back
  9. #define IOS ios::sync_with_stdio(0);cin.tie(0);cout.tie(0)
  10. #define ll long long
  11. #define f first
  12. #define s second
  13.  
  14. using namespace std;
  15. int n, m, k, a[1000000];
  16. const int INF = (int)(1e9 + 7);
  17. const int MAXN = (int)(5e5 + 7);
  18. unordered_map <int, set <int> > sta, sta2;
  19. int t[MAXN * 4], t3[MAXN * 4], t2[MAXN * 4];
  20. void build (int v, int tl, int tr) {
  21.     if (tl == tr){
  22.         if (sta[a[tl]].upper_bound(-tl) == sta[a[tl]].end())
  23.             t[v] = -INF;
  24.         else
  25.             t[v] = -(*sta[a[tl]].upper_bound(-tl));
  26.  
  27.         t2[v] = a[tl];
  28.         t3[v] = a[tl];
  29.     }
  30.     else {
  31.         int tm = (tl + tr) / 2;
  32.         build (v*2, tl, tm);
  33.         build (v*2+1, tm+1, tr);
  34.         t[v] = max(t[v*2], t[v*2+1]);
  35.         t2[v] = max(t2[v*2], t2[v*2+1]);
  36.         t3[v] = min(t3[v*2], t3[v*2+1]);
  37.     }
  38. }
  39.  
  40. int get_max2(int v, int tl, int tr, int l, int r) {
  41.     if (l > r)
  42.         return -INF;
  43.     if (l == tl && r == tr)
  44.         return t[v];
  45.     int tm = (tl + tr) / 2;
  46.     return max(get_max2 (v*2, tl, tm, l, min(r,tm)), get_max2 (v*2+1, tm+1, tr, max(l,tm+1), r));
  47. }
  48.  
  49. int get_max(int v, int tl, int tr, int l, int r) {
  50.     if (l > r)
  51.         return -INF;
  52.     if (l == tl && r == tr)
  53.         return t2[v];
  54.     int tm = (tl + tr) / 2;
  55.     return max(get_max (v*2, tl, tm, l, min(r,tm)), get_max (v*2+1, tm+1, tr, max(l,tm+1), r));
  56. }
  57.  
  58. int get_min(int v, int tl, int tr, int l, int r) {
  59.     if (l > r)
  60.         return INF;
  61.     if (l == tl && r == tr)
  62.         return t3[v];
  63.     int tm = (tl + tr) / 2;
  64.     return min(get_min (v*2, tl, tm, l, min(r,tm)), get_min (v*2+1, tm+1, tr, max(l,tm+1), r));
  65. }
  66.  
  67. void update (int v, int tl, int tr, int pos) {
  68.     if (tl == tr){
  69.         if (sta[a[tl]].upper_bound(-tl) == sta[a[tl]].end())
  70.             t[v] = -INF;
  71.         else
  72.             t[v] = -(*sta[a[tl]].upper_bound(-tl));
  73.  
  74.         t2[v] = a[tl];
  75.         t3[v] = a[tl];
  76.     }
  77.     else {
  78.         int tm = (tl + tr) / 2;
  79.         if (pos <= tm)
  80.             update (v*2, tl, tm, pos);
  81.         else
  82.             update (v*2+1, tm+1, tr, pos);
  83.         t[v] = max(t[v*2], t[v*2+1]);
  84.         t2[v] = max(t2[v*2], t2[v*2+1]);
  85.         t3[v] = min(t3[v*2], t3[v*2+1]);
  86.     }
  87. }
  88.  
  89. int main() {
  90.     IOS;
  91.     int n;
  92.     cin >> n;
  93.     for (int i = 1; i <= n; i++){
  94.         cin >> a[i];
  95.         sta[a[i]].insert(-i);
  96.         sta2[a[i]].insert(i);
  97.     }
  98.     build(1, 1, n);
  99.     int q;
  100.     cin >> q;
  101.     for (int i = 1; i <= q; i++)
  102.     {
  103.         int type;
  104.         cin >> type;
  105.         if (type == 1){
  106.             int pos, val;
  107.             cin >> pos >> val;
  108.             sta[a[pos]].erase(-pos);
  109.             sta2[a[pos]].erase(pos);
  110.             int gg = a[pos];
  111.             a[pos] = val;
  112.             sta[val].insert(-pos);
  113.             sta2[val].insert(pos);
  114.             update(1, 1, n, pos);
  115.             if (sta2[gg].upper_bound(pos) != sta2[gg].end())
  116.                 update(1, 1, n, *sta2[gg].upper_bound(pos));
  117.  
  118.             if (sta2[val].upper_bound(pos) != sta2[val].end())
  119.                 update(1, 1, n, *sta2[val].upper_bound(pos));
  120.         }
  121.         else{
  122.             int l, r;
  123.             cin >> l >> r;
  124.             int l1 = get_min(1, 1, n, l, r);
  125.             int r1 = get_max(1, 1, n, l, r);
  126.             int z = get_max2(1, 1, n, l, r);
  127.             if (z < l && r1 - l1 == r - l)
  128.                 cout << "YES\n";
  129.             else
  130.                 cout << "NO\n";
  131.         }
  132.     }
  133.     return 0;
  134. }
  135. /*
  136.  
  137. 5
  138. 1 3 2 5 4
  139. 8
  140. 2 1 3
  141. 2 1 4
  142. 2 1 5
  143. 1 4 4
  144. 2 1 4
  145. 2 2 5
  146. 1 4 5
  147. 2 2 5
  148. */
Advertisement
Comments
  • User was banned
  • User was banned
  • User was banned
  • User was banned
  • User was banned
Add Comment
Please, Sign In to add comment