#include <bits/stdc++.h>
long memo(int ind,int buy,long *values,int n,vector<vector<long>>&dp){
//base case
if(ind==n){
return 0;
}
if(dp[ind][buy]!=-1){
return dp[ind][buy];
}
long profit=0;
if(buy==0){
profit=max(0+memo(ind+1,0,values,n,dp),-values[ind]+memo(ind+1,1,values,n,dp));
}
if(buy==1){
profit=max(0+memo(ind+1,1,values,n,dp),values[ind]+memo(ind+1,0,values,n,dp));
}
return dp[ind][buy]=profit;
}
long getMaximumProfit(long *values, int n)
{
// vector<vector<long>>dp(n,vector<long>(2,-1));
// if(n==0){
// return 0;
// }
// long ans=memo(0,0,values,n,dp);
// return ans;
//tabulation
// vector<vector<long>>dp(n+1,vector<long>(2,0));
// dp[n][0]=dp[n][1]=0;
// for(int ind=n-1;ind>=0;ind--){
// for(int buy=0;buy<=1;buy++){
// long profit=0;
// if(buy==1){
// profit=max(0+dp[ind+1][1],-values[ind]+dp[ind+1][0]);
// }
// if(buy==0){
// profit=max(0+dp[ind+1][0],values[ind]+dp[ind+1][1]);
// }
// dp[ind][buy]=profit;
// }
// }
// return dp[0][1];
//space optimization
vector<long>prev(2,0),cur(2,0);
prev[0]=prev[1]=0;
for(int ind=n-1;ind>=0;ind--){
for(int buy=0;buy<=1;buy++){
long profit=0;
if(buy==1){
profit=max(0+prev[1],-values[ind]+prev[0]);
}
if(buy==0){
profit=max(0+prev[0],values[ind]+prev[1]);
}
cur[buy]=profit;
}
prev=cur;
}
return prev[1];
}