It might help you to think of your requirements in simpler terms. Instead of thinking of it as relay A on for 30 then AB on for 30 then B on for 30. I just see two relays running for a minute each with the one starting 30 seconds after the other. Problem is that you can't see them this way until you come to grips with blink without delay.
Imagine that you have a 30 second egg timer. You are going to replace the Arduino in the role of turning the relays on or off.
The trigger arrives to tell you to turn the first one on.
So, you turn it on, and flip the egg timer over. You need to stand next to the timer to note exactly when the sand runs out.
When the happens, you flip the second relay on and turn the egg timer over.
You need to stand next to the timer to note exactly when the sand runs out. When the happens, you flip the first relay off, and flip the egg timer over again.
You need to stand next to the timer to note exactly when the sand runs out. When the happens, you flip the second relay off.
Then you stand around and wait for further instructions.
That's the delay paradigm.
Now, for 30 second intervals, it's OK. But suppose the requirement was for 30 minute intervals. Being able to do nothing else for the 90 minutes the relays are on would be a problem, wouldn't it.
Suppose that instead of a 30 minute egg timer, you had a watch and a notepad.
The trigger arrives to turn the first relay on. So, you do that, and you write down when you did that. Then, you get a beer and o watch the ball game. Periodically, you get up and get another beer, and see if it's time to turn the 2nd relay on.
When it is, you do that, and write down when you did that. You can go back to watching the game, and make periodic trips to get rid of the beer. Don't forget to check the time once in a while.
When it is time to turn a relay off, you do that, and scratch out the start time.
THAT is the millis() paradigm. Got to love that approach - more beer!
The millis() function replaces the watch, and a couple of unsigned long variables replace the notepad.
Now, if you read the blink with delay example with this story in mind, does it make more sense?