[proofplan]
The proof has two parts: integrability of the limit, and interchange of limit and integral. For integrability, uniform convergence transfers the oscillation control available for $f_n$ (which satisfies the [Riemann criterion](/theorems/281)) to $f$: uniform closeness of $f$ and $f_n$ bounds how much their upper and lower sums can differ. For the integral interchange, the uniform bound $\|f_n - f\|_\infty$ controls $|\int f_n - \int f|$ directly.
[/proofplan]
[step:Establish boundedness of the limit function $f$]
Since $f_n \to f$ uniformly on $[a,b]$, there exists $N_0 \in \mathbb{N}$ such that $|f_n(x) - f(x)| < 1$ for all $x \in [a,b]$ and all $n \geq N_0$. Since $f_{N_0}$ is bounded, there exists $M > 0$ with $|f_{N_0}(x)| \leq M$ for all $x \in [a,b]$. Then
\begin{align*}
|f(x)| \leq |f(x) - f_{N_0}(x)| + |f_{N_0}(x)| < 1 + M
\end{align*}
for all $x \in [a,b]$, so $f$ is bounded.
[/step]
[step:Transfer the Riemann criterion from $f_N$ to $f$ via uniform closeness]
Fix $\varepsilon > 0$. By uniform convergence, choose $N$ such that
\begin{align*}
\sup_{x \in [a,b]} |f_N(x) - f(x)| < \frac{\varepsilon}{3(b-a)}.
\end{align*}
Since $f_N$ is Riemann integrable, the [Riemann criterion](/theorems/281) provides a partition $P = \{a_0, \ldots, a_m\}$ of $[a,b]$ with
\begin{align*}
U(P, f_N) - L(P, f_N) < \frac{\varepsilon}{3}.
\end{align*}
[guided]
The strategy is to use $f_N$ as an intermediary: we know $f_N$ is integrable (so its upper and lower sums can be made close), and we know $f$ is uniformly close to $f_N$ (so their upper and lower sums are close). Combining these two estimates gives the Riemann criterion for $f$.
We choose $N$ large enough that $\|f_N - f\|_\infty < \varepsilon/(3(b-a))$. The specific choice of $\varepsilon/(3(b-a))$ is engineered so that when we multiply by the total interval length $(b-a)$, the contribution is $\varepsilon/3$. Since the sup and inf are each shifted by at most $\varepsilon/(3(b-a))$, the oscillation on each subinterval picks up an additive error of at most $2\varepsilon/(3(b-a))$, which sums to $2\varepsilon/3$ over the full partition.
Since $f_N$ is Riemann integrable, the [Riemann criterion](/theorems/281) provides a partition $P$ with $U(P,f_N) - L(P,f_N) < \varepsilon/3$. This accounts for the remaining $\varepsilon/3$.
The total error budget is therefore $\varepsilon/3 + 2\varepsilon/3 = \varepsilon$. The factor of $3$ in the denominator was chosen precisely to make this bookkeeping work.
The breakdown: one third for the Riemann criterion of $f_N$, and two thirds for the uniform approximation error (which enters twice --- once through the supremum shift and once through the infimum shift).
[/guided]
[/step]
[step:Bound $U(P,f) - L(P,f)$ to complete the integrability proof]
On each subinterval $[a_j, a_{j+1}]$, the uniform bound $|f(x) - f_N(x)| < \varepsilon/(3(b-a))$ for all $x$ implies
\begin{align*}
\sup_{[a_j, a_{j+1}]} f &\leq \sup_{[a_j, a_{j+1}]} f_N + \frac{\varepsilon}{3(b-a)}, \\
\inf_{[a_j, a_{j+1}]} f &\geq \inf_{[a_j, a_{j+1}]} f_N - \frac{\varepsilon}{3(b-a)}.
\end{align*}
Subtracting:
\begin{align*}
\sup_{[a_j, a_{j+1}]} f - \inf_{[a_j, a_{j+1}]} f \leq \left(\sup_{[a_j, a_{j+1}]} f_N - \inf_{[a_j, a_{j+1}]} f_N\right) + \frac{2\varepsilon}{3(b-a)}.
\end{align*}
Multiplying by $a_{j+1} - a_j$ and summing over $j$:
\begin{align*}
U(P,f) - L(P,f) &\leq \bigl(U(P,f_N) - L(P,f_N)\bigr) + \frac{2\varepsilon}{3(b-a)} \sum_{j=0}^{m-1}(a_{j+1} - a_j) \\
&< \frac{\varepsilon}{3} + \frac{2\varepsilon}{3(b-a)} \cdot (b-a) = \frac{\varepsilon}{3} + \frac{2\varepsilon}{3} = \varepsilon.
\end{align*}
Since $\varepsilon > 0$ was arbitrary, $f$ satisfies the [Riemann criterion](/theorems/281) and is Riemann integrable.
[guided]
The key manipulation is controlling how the supremum and infimum of $f$ relate to those of $f_N$ on each subinterval. If $f(x) \leq f_N(x) + \varepsilon/(3(b-a))$ for all $x$ in a subinterval, then the supremum of $f$ is at most the supremum of $f_N$ plus $\varepsilon/(3(b-a))$. Similarly for the infimum but in the opposite direction.
Subtracting the infimum bound from the supremum bound introduces a factor of $2$ in the correction term: the oscillation of $f$ exceeds the oscillation of $f_N$ by at most $2\varepsilon/(3(b-a))$.
Multiplying by the subinterval lengths and summing telescopes the partition:
\begin{align*}
U(P,f) - L(P,f) &\leq \bigl(U(P,f_N) - L(P,f_N)\bigr) + \frac{2\varepsilon}{3(b-a)} \cdot (b-a) \\
&< \frac{\varepsilon}{3} + \frac{2\varepsilon}{3} = \varepsilon.
\end{align*}
The $1/3 + 2/3 = 1$ arithmetic was designed from the start by the choice of $\varepsilon/(3(b-a))$ as the uniform approximation threshold.
[/guided]
[/step]
[step:Prove the interchange of limit and integral]
Choose $N$ such that $\sup_{x \in [a,b]} |f_n(x) - f(x)| < \varepsilon/(b-a)$ for all $n \geq N$. For any such $n$:
\begin{align*}
\left|\int_a^b f_n(x)\,dx - \int_a^b f(x)\,dx\right| = \left|\int_a^b (f_n(x) - f(x))\,dx\right| \leq \int_a^b |f_n(x) - f(x)|\,dx < \frac{\varepsilon}{b-a} \cdot (b-a) = \varepsilon.
\end{align*}
Since $\varepsilon > 0$ was arbitrary, $\lim_{n \to \infty} \int_a^b f_n(x)\,dx = \int_a^b f(x)\,dx$.
[/step]