Hi Elisabetta, of course.
The idea from functional programming comes from an old mathematical language (before computers) called lambda-calculus. This language defined as only way to create behaviors functions that receive arguments and return results. Although it seems simple, it had a lot of implications.
An example of the lambda-calculus function would be the addition: it takes two arguments and returns de result. And nowadays, it could be the function to add one element to the shopping cart, that receives the current shopping cart and one article, and returns a new shopping cart that includes the article. And the trick is the word new.
When modern programming languages emerged, they started to create procedures, code that you could call to perform and action, and later they were called functions when they were able to return results.
But the problem is that those functions were different from the lambda-calculus mathematical function. For example, we could imagine an add to cart function that takes the cart, and adds inside the article. But that does not follow the original definition, this "function" manipulates the original argument, so, next calls would return different results. It that for us, programmers, is normal, for mathematics is inconceivable. For them, it is like saying that a function that increments one in any number, modifies it, so for example, once you increment(2), at that moment, any use of 2 will be 3. That is what we do with programming languages.
So, here is where we come back to the "purity". We, in programming, can create functions that follow the principles of the original lambda-calculus, or we can create functions that act more like procedures. That is something that we can choose. Because both are functions, we need a word to distinguish both of them. So, somehow, we decided that "functional pure" are those implementations that follow the idea of the original lambda-calculus, and "functional impure" are nothing else that procedures.
Each one has its own advantages and penalties. For example, pure functions cannot print on the screen (long story, but they need to change something), so impure are necessary for that. But pure functions are highly predictive, so there are countless optimizations that we can perform.
By the way, a nice anecdote, the name of "Y Combinator" comes from lambda-calculus. It is a construction that allows creating recursive functions in that language.