#include #include #include using namespace std; typedef long long ll; #define lson l , m , rt << 1 #define rson m + 1 , r , rt << 1 | 1 const int maxn = 100000+9; int MAX[maxn<<2]; int inp[maxn]; int iab[maxn],cntb; void PushUP(int rt) { MAX[rt] = max(MAX[rt<<1] , MAX[rt<<1|1]); } void build(int l,int r,int rt) { if (l == r) { // scanf("%d",&MAX[rt]); MAX[rt]=iab[cntb++]; // printf("rt=%d\n"); return ; } int m = (l + r) >> 1; build(lson); build(rson); PushUP(rt); } void update(int p,int sc,int l,int r,int rt) { if (l == r) { MAX[rt] = sc; return ; } int m = (l + r) >> 1; if (p <= m) update(p , sc , lson); else update(p , sc , rson); PushUP(rt); } int query(int L,int R,int l,int r,int rt) { if (L <= l && r <= R) { return MAX[rt]; } int m = (l + r) >> 1; int ret = 0; if (L <= m) ret = max(ret , query(L , R , lson)); if (R > m) ret = max(ret , query(L , R , rson)); return ret; } int main() { #ifndef ONLINE_JUDGE freopen("C:\\Users\\Zmy\\Desktop\\in.txt","r",stdin); // freopen("C:\\Users\\Zmy\\Desktop\\out.txt","w",stdout); #endif int o; scanf("%d",&o); while(o--) { memset(iab,0,sizeof(iab)); int n; scanf("%d",&n); for(int i=1;i<=n;i++) { scanf("%d",&inp[i]); } for(int i=1;i<=n-1;i++) { iab[i]=abs(inp[i+1]-inp[i]); } cntb=1; n-=1; build(1,n,1); ll ans=0; ans+=query(2 , n , 1 , n , 1); for(int i=2;i<=n;i++) { update(i, abs(inp[i+1]-inp[i-1]), 1 , n , 1); update(i-1, abs(inp[i+1]-inp[i-1]), 1 , n , 1); int d=query(1 , n , 1 , n , 1); update(i, abs(inp[i+1]-inp[i]), 1 , n , 1); update(i-1, abs(inp[i]-inp[i-1]), 1 , n , 1); ans+=d; } ans+=query(1 , n-1 , 1 , n , 1); printf("%I64d\n",ans); //a b } // int n , m; // while (~scanf("%d%d",&n,&m)) { // build(1 , n , 1); // while (m --) { // char op[2]; // int a , b; // scanf("%s%d%d",op,&a,&b); // if (op[0] == 'Q') printf("%d\n",query(a , b , 1 , n , 1)); // else update(a , b , 1 , n , 1); // } // } return 0; }