Suppose that there are 2000 stones **in a row**.  
You should grind 1000 of them to make beads.  
The time loads(making beads) for each stone are similar.  
But which 1000 stones?

case1) the **first 1000** stones.


case2) Let `B = RandomSample[Range[2000], 1000]`.  
  Then, **all b-th** stones, where **b** denotes element of `B`.
  
If this is a problem of **real world**, then case1) is faster then case2), because  
for case2),
1) You have to read the `B` every time after grinding a stone.
2) If the next stone to be processed is far away, it will take a long time to go there.
3) `B` is even not sorted by size.

But, if it was a problem of **mathematica,**

2000 stones in a row = a list of 2000 elements  
grinding a stone = applying function to an element

The time loads for case1) and time loads for case2) should be similar in my opinion.

I experienced that
"**just because some elements of a list are positionally close, there is no particular advantage to processing(=applying function) them at once(or consecutively)**"

Also I believe that
"there is a fast mathematica code for case2) always, that takes silmilar time compared to case1)"

Am I thinking correctly?

If so, can you make a fast code for the following problem ?

For `L`, square(=apply `#^2&`) each b-th element of `L`.(leave other element unchanged)

    L = Range[40000, 59999];
    B = RandomSample[Range[20000], 10000];

My first trial was

    MapAt[#^2&, L, {#}&/@B] //Timing
    2.85938

which is never successful.

After some more trials, I realized that **MapAt is very slow, in all case**.  
The performance was so bad that I felt **MapAt should not be used in any case**.

Can you help me?