Read and write values in Multidimensional arrays in verilog
This is not one question but breaking down the main points:

&lt;= is a non-blocking assignment used when implying a flip-flop output.
= is a blocking assignment used when implementing combinatorial output.

example usage:

input [10:0] in_data;

reg [11:0] flip_flop;
reg [11:0] next_data

//Flip-flop
always @(posedge clock) begin
  flip_flop &lt;= next_data;
end

//Combinatorial
always @* begin
  next_data = in_data + 11'd1;
end 


You defined 3 different data types:

input [15:0] me;
reg [15:0] p_array [7:0];
reg abc_pqr [2:0];          //Same as reg [0:0] abc_pqr [2:0]


me is a standard 16 bit word. p_array is an 8 deep memory of 16 bit words.
NB: it is typical to define as reg [15:0] p_array [0:7];
abc_pqr [2:0]; is a 3 deep 1bit memory.

You have :

abc_pqr[0] &lt;= me[0]; //This is a 1 bit assignment:
abc_pqr[1] &lt;= me[1];
abc_pqr[2] &lt;= me[2]; //&lt;-- corrected this to 2


Looks valid.  

Then :

p_array[abc_pqr[0]] &lt;= me[0];


p_array needs a [7:0] wide index, you have only supplied 1 bit. and a p_array element is 16 bits wide your left hand side is again only 1 bit.