1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
#include <bits/stdc++.h>
using namespace std;

using ll = int64_t;

void solve() {
  int n;
  cin >> n;

  vector<int> vs(n);
  for(auto& v : vs) {
    cin >> v;
  }

  int mi = max_element(vs.begin(), vs.end()) - vs.begin();

  vector<int> stack;
  stack.push_back(vs[mi]);

  int i = (n + mi - 1) % n;
  int ans = 0;
  while(i != mi) {

    while(!stack.empty() && stack.back() <= vs[i]) {
      stack.pop_back();
    }
    stack.push_back(vs[i]);
    ans = max<int>(ans, stack.size());


    i--;
    if(i < 0) {
      i += n;
    }
  }

  cout << ans;
}

int main() {
  ios_base::sync_with_stdio(0);
  cin.tie(0);
  cout.tie(0);
  //freopen("kam1.in", "r", stdin);
  solve();
}



// idea:
/*

DSU na kolor
DSU na usuniete

Robimy usun wierzcholek (czy cos takiego)
- najpierw patrzy na wszystkich sasiadow, ktorzy sa usunieci mergujemy ich w jednego usunietego
- dla kazdego sasiada patrzymy czy jest juz w zbiorze naszego zmergowanego jezeli nie to union i zmniejszami liczbe componentow
- jak robimy mergowanie:
- - mamy kilka usunietych (znamy ich id w uf) np 1, 2, 3, 10
- - robimy na nich union
- - mamy tez vector<set<int>> - zbior sasiadow dla usunietego
- - do najwiekszego setu dodajemy reszte
- - std::swap i cleary
- - no i teoria jest taka, wartosci w setach mamy sumarycznie tyle co krawedzi wiec to powinny byc mlogm czy cos, ale moze to nie prawda
*/