The [challenge](http://www.codechef.com/APRIL14/problems/ADIGIT) is to reconstruct an _n_-digit number using the following information: > On each step, you choose an index _x_ from 1 to _n_. For all indices _y_ (_y_ > < _x_), you calculate the difference _b_<sub>_y_</sub> = _a_<sub>_x_</sub> - _a_<sub>_y_</sub>. > > You then calculate _B_<sub>1</sub> — sum of all by which are greater > than 0 and _B_<sub>2</sub> — sum of all by which are less than 0. > > The answer for this step is _B_<sub>1</sub> - _B_<sub>2</sub>. > > **Input** > > The first line contains two integers *n* and *m*, denoting the number > of digits and number of steps. The second line contains *n* digits > (without spaces) _a_<sub>1</sub>, _a_<sub>2</sub>, ..., _a_<sub>_n_</sub>. > Each of the next *m* lines contains a single integer *x* denoting the index for > the current step. > > **Output** > > For each of _m_ steps print single number in a line - answer of the > step. Can someone please help me optimize this code or provide a better, less time-consuming solution? import java.io.*; import java.util.*; public class Chefs { //BufferedReader in; DataInputStream in; PrintWriter out; HashMap<Integer,Integer> mymap=new HashMap<Integer,Integer>(); int a[],n,m,b1,b2; public Chefs() { //in=new BufferedReader(new InputStreamReader(System.in)); in=new DataInputStream(System.in); out=new PrintWriter(System.out,true); readInput(); calchef(); } void readInput() { try { String digit=in.readLine(); String split[]=digit.split("\\s+"); n=Integer.parseInt(split[0]); m=Integer.parseInt(split[1]); a=new int[n]; digit=in.readLine(); for(int i=0;i<digit.length();i++) a[i]=digit.charAt(i); } catch(Exception e) { e.printStackTrace(); } } void calchef() { for(int i=0;i<m;i++) { try { b1=0; b2=0; int index=Integer.parseInt(in.readLine()); if(mymap.containsKey(index)) { int ans=mymap.get(index); out.println(ans); } else { for(int j=0;j<index-1;j++) { if(a[index-1]-a[j]>0) { b1+=(a[index-1]-a[j]); } else { b2+=(a[index-1]-a[j]); } } int ans=b1-b2; out.println(ans); mymap.put(index,ans); } } catch(Exception e) { e.printStackTrace(); } } } public static void main(String[] args) { //long startTime = System.currentTimeMillis(); Chefs c=new Chefs(); //long endTime = System.currentTimeMillis(); //long totalTime = endTime - startTime; //System.out.println(totalTime); } }