Usually, the 'flat' part tells you how much time was spent in a given function/routine/... whereas the 'cum' part refers to 'cumulative' and contains the current function/routine/... plus everything "above"/"below" it.
Suppose we sample the program and whenever we do, we obtain the stack of the program. the bottom of the stack explains where we currently are, and the stack itself tells us where we came from. After a run, we can gather together all the samples and have a rough estimate of where the program is spending its time by looking at the bottom of the stack. This is the flat profile, usually.
However, the stack itself is also interesting, because if you have two call paths a->b->c->d and a->b->c->e, and you are spending 1 second in d and 1 second in e, then you could say you are spending 2 seconds "below" c. Hence the "(ac)cumulative" time spent in c is 2 seconds.
I don't know the exact definition of the pprof output, but usually this is what happens in a sampling profiler, and you need a way to quickly discern how to interpret the price of paths in the call-graph of the program. In the view of the graph, c above would "dominate" d and e (provided c is the only way to get to d and e!)