• Source
    1. #include <iostream>
    2. #include <stack>
    3. #include <vector>
    4. #include <math.h>
    5. using namespace std;
    6.  
    7. int main ()
    8. {
    9. int n;
    10. cin>>n;
    11. vector <long> arr;
    12. vector <long> left (1000005, 0);
    13. vector <long> right (1000005, 0);
    14. arr.push_back(0);
    15. for (int i=1; i<=n; i++)
    16. {
    17. long tmp;
    18. cin>>tmp;
    19. arr.push_back (tmp);
    20. }
    21. arr.push_back(0);
    22.  
    23. stack <int> SL;
    24. SL.push(0);
    25. for (int i=1; i<=n; i++)
    26. {
    27. while (!SL.empty() && arr[SL.top()]>=arr[i]) SL.pop();
    28. if (!SL.empty()) left[i]=SL.top();
    29. SL.push(i);
    30. }
    31.  
    32. stack <int> SR;
    33. SR.push(n+1);
    34. for (int i=n; i>=1; i--)
    35. {
    36. while (!SR.empty() && arr[SR.top()]>=arr[i]) SR.pop();
    37. if (!SR.empty()) right[i]=SR.top();
    38. SR.push(i);
    39. }
    40. long Ans=0;
    41. for (int i=1; i<=n; i++)
    42. {
    43. if (right[i]-left[i]-1 >= arr[i]) Ans = max (Ans, arr[i]);
    44. }
    45. cout<<Ans;
    46. return 0;
    47. }