Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include<bits/stdc++.h>
- using namespace std;
- const int NMAX=2e5;
- int a[NMAX+5];
- int g_left[NMAX+5],g_right[NMAX+5];
- int l_left[NMAX+5],l_right[NMAX+5];
- const int LOG=20;
- int dp_left[LOG+2][NMAX+5];
- int dp_right[LOG+2][NMAX+5];
- signed main(){
- ios_base::sync_with_stdio(0);cin.tie(0);cout.tie(0);
- int n;
- cin>>n;
- for(int i=1;i<=n;i++)cin>>a[i];
- vector<int>st;
- // greater right
- for(int i=1;i<=n;i++){
- while(!st.empty()&&a[st.back()]<a[i])g_right[st.back()]=i,st.pop_back();
- st.push_back(i);
- }
- while(!st.empty())g_right[st.back()]=n+1,st.pop_back();
- // less right
- for(int i=1;i<=n;i++){
- while(!st.empty()&&a[st.back()]>a[i])l_right[st.back()]=i,st.pop_back();
- st.push_back(i);
- }
- while(!st.empty())l_right[st.back()]=n+1,st.pop_back();
- // greater left
- for(int i=n;i>=1;i--){
- while(!st.empty()&&a[st.back()]<a[i])g_left[st.back()]=i,st.pop_back();
- st.push_back(i);
- }
- while(!st.empty())g_left[st.back()]=0,st.pop_back();
- // less left
- for(int i=n;i>=1;i--){
- while(!st.empty()&&a[st.back()]>a[i])l_left[st.back()]=i,st.pop_back();
- st.push_back(i);
- }
- while(!st.empty())l_left[st.back()]=0,st.pop_back();
- /*cout<<"GREATER LEFT\n";
- for(int i=1;i<=n;i++)cout<<g_left[i]<<" ";cout<<"\n";
- cout<<"GREATER RIGHT\n";
- for(int i=1;i<=n;i++)cout<<g_right[i]<<" ";cout<<"\n";
- cout<<"LESS LEFT\n";
- for(int i=1;i<=n;i++)cout<<l_left[i]<<" ";cout<<"\n";
- cout<<"LESS RIGHT\n";
- for(int i=1;i<=n;i++)cout<<l_right[i]<<" ";cout<<"\n";*/
- for(int i=1;i<=n;i++)dp_left[0][i]=g_left[i];
- for(int i=1;i<=n;i++)dp_right[0][i]=g_right[i];
- for(int lvl=1;lvl<=LOG;lvl++){
- for(int i=1;i<=n;i++){
- if(dp_left[lvl-1][i]==0)dp_left[lvl][i]=0;
- else dp_left[lvl][i]=dp_left[lvl-1][dp_left[lvl-1][i]];
- if(dp_right[lvl-1][i]==n+1)dp_right[lvl][i]=n+1;
- else dp_right[lvl][i]=dp_right[lvl-1][dp_right[lvl-1][i]];
- }
- }
- long long ans=0;
- for(int i=1;i<=n;i++){
- int L=l_left[i];
- int R=l_right[i];
- int cnt=0,pL=i,pR=i;
- for(int lvl=LOG;lvl>=0;lvl--){
- if(dp_left[lvl][pL]>L)pL=dp_left[lvl][pL],cnt+=(1<<lvl);
- if(dp_right[lvl][pR]<R)pR=dp_right[lvl][pR],cnt+=(1<<lvl);
- }
- ans+=cnt+1;
- }
- cout<<ans<<"\n";
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement