

import java.util.Scanner;
public class Main {
private static int n;
private static int[] p;
private static int[] s;
private static int[] next;
/**
* @param args
*/
public static void main(String[] args) {
init();
compress();
print();
}
private static void print(){
System.out.println("存储整个像素序列所需的最少存储位数为"+s[n]);
int k=n;
while(k!=0){
System.out.println("p"+(next[k]+1)+"--->p"+k+" 需要的存储位数为:"+(s[k]-s[next[k]]));
k=next[k];
}
}
private static void compress(){
for(int i=1;i<=n;i++){
s[i]=Integer.MAX_VALUE;
for(int k=1;k<=Math.min(i,256);k++){
int temp=s[i-k]+k*bMax(i-k+1,i)+11;
if(temp<s[i]){
s[i]=temp;
next[i]=i-k;
}
}
}
}
private static void init(){
Scanner sc=new Scanner(System.in);
n=sc.nextInt();
p=new int[n+1];
s=new int[n+1];
next=new int[n+1];
for(int i=1;i<=n;i++){
p[i]=sc.nextInt();
}
}
private static int bMax(int i,int j){
int pMax=-1;
for(int k=i;k<=j;k++){
if(p[k]>pMax){
pMax=p[k];
}
}
return (int)Math.ceil(Math.log(pMax+1)/Math.log(2));
}
}