Advertisement
Guest User

Olympiad Problem

a guest
Jun 27th, 2022
200
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 0.95 KB | None | 0 0
  1. #include <bits/stdc++.h>
  2. using namespace std;
  3.  
  4. const int N = 1e5 + 20;
  5.  
  6. int t[4 * N], added[4 * N];
  7. vector<int> occ[N];
  8.  
  9. void inc(int v, int tl, int tr, int l, int r, int val){
  10.   if (l > r) return;
  11.   if (tl == l && tr == r){
  12.     t[v] += val, added[v] += val;
  13.     return;
  14.   }
  15.   int tm = (tl + tr) / 2;
  16.   inc(2 * v + 1, tl, tm, l, min(r, tm), val);
  17.   inc(2 * v + 2, tm + 1, tr, max(l, tm + 1), r, val);
  18.   t[v] = max(t[2 * v + 1], t[2 * v + 2]) + added[v];
  19. }
  20.  
  21. int main(){
  22.   int n;
  23.   cin >> n;
  24.   int ans = 0;
  25.   for (int i = 0; i < n; i++){
  26.     int x;
  27.     cin >> x;
  28.     if (!occ[x].empty()){
  29.       int l = (occ[x].size() == 1? -1 : occ[x].end()[-2]) + 1, r = occ[x].back();
  30.       inc(0, 0, n - 1, l, r, +1);
  31.       if (occ[x].size() > 1){
  32.         r = l - 1, l = (occ[x].size() == 2? -1 : occ[x].end()[-3]) + 1;
  33.         inc(0, 0, n - 1, l, r, -1);
  34.       }
  35.     }
  36.     occ[x].push_back(i);
  37.     ans = max(ans, t[0]);
  38.   }
  39.   cout << ans << endl;
  40. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement