<SYSTEM_TASK:>
Solve the following problem using Python, implementing the functions described below, one line at a time
<END_TASK>
<USER_TASK:>
Description:
 def calc_tf_ic_v1(self):
 """Calculate throughfall and update the interception storage accordingly. Required control parameters: |NmbZones| |ZoneType| |IcMax| Required flux sequences: |PC| Calculated fluxes sequences: |TF| Updated state sequence: |Ic| Basic equation: :math:`TF = \\Bigl \\lbrace { {PC \\ | \\ Ic = IcMax} \\atop {0 \\ | \\ Ic < IcMax} }` Examples: Initialize six zones of different types. Assume a generall maximum interception capacity of 2 mm. All zones receive a 0.5 mm input of precipitation: For glaciers (first zone) and internal lakes (second zone) the interception routine does not apply. Hence, all precipitation is routed as throughfall. For fields and forests, the interception routine is identical (usually, only larger capacities for forests are assumed, due to their higher leaf area index). Hence, the results of the third and the second zone are equal. The last three zones demonstrate, that all precipitation is stored until the interception capacity is reached; afterwards, all precepitation is routed as throughfall. Initial storage reduces the effective capacity of the respective simulation step: ic(0.0, 0.0, 0.5, 0.5, 1.5, 2.0) tf(0.5, 0.5, 0.0, 0.0, 0.0, 0.5) A zero precipitation example: ic(0.0, 0.0, 0.0, 0.0, 1.0, 2.0) tf(0.0, 0.0, 0.0, 0.0, 0.0, 0.0) A high precipitation example: ic(0.0, 0.0, 2.0, 2.0, 2.0, 2.0) tf(5.0, 5.0, 3.0, 3.0, 4.0, 5.0) """

    con = self.parameters.control.fastaccess
    flu = self.sequences.fluxes.fastaccess
    sta = self.sequences.states.fastaccess
    for k in range(con.nmbzones):
        if con.zonetype[k] in (FIELD, FOREST):
            flu.tf[k] = max(flu.pc[k]-(con.icmax[k]-sta.ic[k]), 0.)
            sta.ic[k] += flu.pc[k]-flu.tf[k]
        else:
            flu.tf[k] = flu.pc[k]
            sta.ic[k] = 0.