RMQ рд╕рдорд╕реНрдпрд╛ - 2. рд▓рд╛рдЗрди рдЯреНрд░реА

рд╣рдорд╛рд░реЗ рд╡рд┐рд╖рдп рдХреЗ рдкрд╣рд▓реЗ рднрд╛рдЧ рдореЗрдВ , рд╣рдордиреЗ (O (nlogn), O (1)) рдореЗрдВ рд╕реНрдерд┐рд░ RMQ рд╕рдорд╕реНрдпрд╛ рдХреЗ рд╕рдорд╛рдзрд╛рди рдХреА рдЬрд╛рдБрдЪ рдХреАред рдЕрдм рд╣рдо рдЦрдВрдб, рдпрд╛ рдЕрдВрддрд░рд╛рд▓ (рдЕрдВрдЧреНрд░реЗрдЬреА рд╕рд╛рд╣рд┐рддреНрдп рдореЗрдВ - рдЦрдВрдб рд╡реГрдХреНрд╖ рдпрд╛ рдЕрдВрддрд░рд╛рд▓ рд╡реГрдХреНрд╖) рдирд╛рдордХ рд╡реГрдХреНрд╖ рдХреА рд╕рдВрд░рдЪрдирд╛ рд╕реЗ рдирд┐рдкрдЯреЗрдВрдЧреЗред рдЗрд╕рдХрд╛ рдЙрдкрдпреЛрдЧ рдХрд░рдХреЗ, рдЖрдк рдбрд╛рдпрдирд╛рдорд┐рдХ RMQ рдЗрди (O (n), O (logn)) рдХреЛ рд╣рд▓ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред

рдкрд░рд┐рднрд╛рд╖рд╛



рд╣рдо рдЦрдВрдбреЛрдВ рдХреЗ рдПрдХ рдкреЗрдбрд╝ рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред рд╕реБрд╡рд┐рдзрд╛ рдХреЗ рд▓рд┐рдП, рд╣рдо рд╕рд░рдгреА рдХреА рд▓рдВрдмрд╛рдИ рдХреЛ рджреЛ рдХреА рд╢рдХреНрддрд┐ рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рд╣рдо рд╕рд░рдгреА рдХреЗ рдЬреЛрдбрд╝реЗ рдЧрдП рддрддреНрд╡реЛрдВ рдореЗрдВ рдЕрдирдВрддрддрд╛ рдХреЛ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВ (рдЕрдирдВрдд рдХреЗ рд▓рд┐рдП рдпрд╣ рд╕рдордЭрдиреЗ рдХреЗ рд▓рд┐рдП рд╕рд╛рд░реНрдердХ рд╣реИ, рдЙрджрд╛рд╣рд░рдг рдХреЗ рд▓рд┐рдП, рдПрдХ рд╕рдВрдЦреНрдпрд╛ рдЕрдзрд┐рдХ рд╣реИ рдЬрд┐рд╕рдореЗрдВ рдбреЗрдЯрд╛ рдореЗрдВ рдХреБрдЫ рднреА рдирд╣реАрдВ рджрд┐рдЦрддрд╛ рд╣реИ)ред рддреЛ, рдЦрдВрдбреЛрдВ рдХрд╛ рд╡реГрдХреНрд╖ рдПрдХ рджреНрд╡рд┐рдЖрдзрд╛рд░реА рд╡реГрдХреНрд╖ рд╣реЛрддрд╛ рд╣реИ, рдЬрд┐рд╕рдХреЗ рдкреНрд░рддреНрдпреЗрдХ рд╢реАрд░реНрд╖ рдкрд░ рдПрдХ рдирд┐рд╢реНрдЪрд┐рдд рдЦрдВрдб рдкрд░ рдПрдХ рджрд┐рдП рдЧрдП рдлрд▓рди рдХрд╛ рдорд╛рди рд▓рд┐рдЦрд╛ рд╣реЛрддрд╛ рд╣реИред рд╣рдорд╛рд░реЗ рдорд╛рдорд▓реЗ рдореЗрдВ рдХрд╛рд░реНрдп рдПрдХ рдиреНрдпреВрдирддрдо рд╣реИред

рдкреНрд░рддреНрдпреЗрдХ рд╢реАрдЯ рдореЗрдВ рдПрдХ рд╕рд░рдгреА рддрддреНрд╡ рд╣реЛрдЧрд╛ рдЬрд┐рд╕рдореЗрдВ рдкреЗрдбрд╝ рдореЗрдВ рд╢реАрдЯ рдХреА рдХреНрд░рдорд┐рдХ рд╕рдВрдЦреНрдпрд╛ рдХреЗ рдмрд░рд╛рдмрд░ рд╕рдВрдЦреНрдпрд╛ рд╣реЛрддреА рд╣реИред рдФрд░ рдкреНрд░рддреНрдпреЗрдХ рд╢рд┐рдЦрд░ рдЬреЛ рдПрдХ рдкрддреНрддреА рдирд╣реАрдВ рд╣реИ, рдЗрд╕ рд╢реАрд░реНрд╖ рдХреЗ рд╡рдВрд╢рдЬ рд╢реАрдЯреНрд╕ рдХреЗ рдЕрдиреБрд░реВрдк рд╕рд░рдгреА рддрддреНрд╡реЛрдВ рдХреЗ рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛ред



рдкрд░рд┐рднрд╛рд╖рд╛ рдХреА рд╕реНрдкрд╖реНрдЯ рд╕рдВрдХреАрд░реНрдгрддрд╛ рдХреЗ рдкреАрдЫреЗ рдПрдХ рдкреВрд░реА рддрд░рд╣ рд╕реЗ рд╕рд░рд▓ рдЕрд╡рдзрд╛рд░рдгрд╛ рдирд┐рд╣рд┐рдд рд╣реИ - рд╣рдо рдЕрдкрдиреА рдЖрдВрдЦреЛрдВ рдХреЛ рдЖрдХреГрддрд┐ рдореЗрдВ рдмрджрд▓ рджреЗрддреЗ рд╣реИрдВред



рдЖрдЗрдП рд╣рдо рдЗрд╕рдХреА рдкрд░рд┐рднрд╛рд╖рд╛ рдмрддрд╛рддреЗ рд╣реИрдВред рдЪрдпрдирд┐рдд рд╡рд░реНрдЯреЗрдХреНрд╕ рдЪрд┐рд╣реНрдирд┐рдд рд╕реЗрдЧрдореЗрдВрдЯ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрдЧрд╛, рдХреНрдпреЛрдВрдХрд┐ рдпрд╣ рджрд┐рдП рдЧрдП рд╡рд░реНрдЯреЗрдХреНрд╕ рдХреЗ рд╕рднреА рд╡рдВрд╢рдЬ рд╢реАрдЯреНрд╕ рдХрд╛ рдорд┐рд▓рди рд╣реИ (рдЗрд╕ рдХреНрд╖рдг рд╕реЗ рд╢реБрд░реВ рд╣реЛрдиреЗ рдкрд░, рд╣рдо рд╢реАрдЯ рдФрд░ рд╕рд░рдгреА рддрддреНрд╡ рдХреА рдкрд╣рдЪрд╛рди рдХрд░рддреЗ рд╣реИрдВ рдЬреЛ рдпрд╣ рджрд░реНрд╢рд╛рддрд╛ рд╣реИ)ред

рд╣рдо рдкреЗрдбрд╝ рдХреЛ рдмрд╛рдЗрдирд░реА рд╣реАрдк рдХреА рддрд░рд╣ рд╕реНрдЯреЛрд░ рдХрд░реЗрдВрдЧреЗред рд╣рдореЗрдВ рд╕рд░рдгреА T [2n - 1] рдорд┐рд▓рддреА рд╣реИред рдЬрдбрд╝ рд╕рд░рдгреА рдХреЗ рдкрд╣рд▓реЗ рддрддреНрд╡ рдореЗрдВ рдЭреВрда рд╣реЛрдЧрд╛, рдФрд░ рдЖрдИ-рд╡реЗрдВ рд╢реАрд░реНрд╖ рдХреЗ рдмреЗрдЯреЗ рдХреНрд░рдорд╢рдГ 2i рдФрд░ 2i + 1 рдХреЗ рд╕рд╛рде рддрддреНрд╡реЛрдВ рдореЗрдВ рдЭреВрда рдмреЛрд▓реЗрдВрдЧреЗ - рдмрд╛рдПрдВ рдФрд░ рджрд╛рдПрдВ, рдХреНрд░рдорд╢рдГред рдЖрдк рддреБрд░рдВрдд рд╕реНрдкрд╖реНрдЯ рд╕рдВрдкрддреНрддрд┐ рдиреЛрдЯрд┐рд╕ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВ: рдЯреАрде [i] = рдорд┐рдирдЯ (рдЯреА [2 рдЖрдИ], рдЯреА [2 рдЖрдИ + 1]) рдХреЗ рд▓рд┐рдП рдЖрдИрде рд╡рд░реНрдЯреЗрдХреНрд╕ рдЬреЛ рдХрд┐ рдПрдХ рдкрддреНрддреА рдирд╣реАрдВ рд╣реИред рд╢реАрдЯ, рд╡реИрд╕реЗ, рдПрди рдХреЗ 2 рдПрди - 1 рд╕реЗ рд╕рдВрдЦреНрдпрд╛ рд╡рд╛рд▓реЗ рддрддреНрд╡реЛрдВ рдореЗрдВ рдЗрд╕ рддрд░рд╣ рдХреЗ рдирдВрдмрд░рд┐рдВрдЧ рдХреЗ рд╕рд╛рде рдЭреВрда рд╣реЛрдЧрд╛ред

рдЗрдорд╛рд░рдд



рд╣рдо (n - 1) рд╡реЗрдВ рд╕реЗ рддрддреНрд╡реЛрдВ рдХреЗ рдКрдкрд░ рдЬрд╛рдХрд░ рдПрдХ рдкреЗрдбрд╝ рдХрд╛ рдирд┐рд░реНрдорд╛рдг рдХрд░реЗрдВрдЧреЗ, рдЬреЛ рдХрд┐ рдЙрдирдХреЗ рд╢реАрд░реНрд╖ рдХреЗ рд▓рд┐рдП рдмреЗрдЯреЛрдВ рдореЗрдВ рдиреНрдпреВрдирддрдо рдореВрд▓реНрдпреЛрдВ рдХреЛ рдЧрд┐рдирд╛ рдЬрд╛рдПрдЧрд╛ред
рдЗрд╕ рд▓реЗрдЦ рд╕реЗ рд╢реБрд░реВ рдХрд░рдХреЗ рдореИрдВ рдЕрдзрд┐рдХ рд╕реНрдкрд╖реНрдЯрддрд╛ рдХреЗ рд▓рд┐рдП рдПрдХ рдХреЛрдб рджреВрдВрдЧрд╛ред

const int INF = INT_MAX; void build_tree(const vector<int>& V) { // ,     int n = (1 << (log(n - 1) + 1)); V.resize(2 * n, INF); //   for (int i = n; i < 2 * n; i++) V[i] = V[i - n]; //     for (int i = n - 1; i > 0; i--) V[i] = min(V[2 * i], V[2 * i + 1]); } 


Build_tree (V) рдлрд╝рдВрдХреНрд╢рди рдЗрд╕ рд╕рд░рдгреА рдХреЗ рд▓рд┐рдП рд╕рд░рдгреА V рдХреЛ рдПрдХ рд▓рд╛рдЗрди рдЯреНрд░реА рдореЗрдВ рдмрджрд▓ рджреЗрддрд╛ рд╣реИред рддреЛ, рдЕрдм рдЗрд╕ рдкрд░ рдПрдХ рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдиреНрдпреВрдирддрдо рдЦреЛрдЬрдиреЗ рдХреЗ рд▓рд┐рдП рдХреИрд╕реЗ? рдРрд╕рд╛ рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП, рд╣рдо рдПрдХ рдореМрд▓рд┐рдХ рдЦрдВрдб рдХреА рдЕрд╡рдзрд╛рд░рдгрд╛ рдХреЛ рдкреЗрд╢ рдХрд░рддреЗ рд╣реИрдВред

рдиреНрдпреВрдирддрдо рдЕрдиреБрд░реЛрдз



рд╣рдо рд╕рд░рдгреА рдореЗрдВ рдореВрд▓рднреВрдд рд╕реЗрдЧрдореЗрдВрдЯ рдХреЛ рдРрд╕реЗ рд╕реЗрдЧрдореЗрдВрдЯ рдореЗрдВ рдХрд╣рддреЗ рд╣реИрдВ рдХрд┐ рдкреЗрдбрд╝ рдореЗрдВ рдПрдХ рд╢реАрд░реНрд╖ рд╣реЛрддрд╛ рд╣реИ рдЬрд┐рд╕рд╕реЗ рдпрд╣ рдореЗрд▓ рдЦрд╛рддреА рд╣реИред рд╣рдо рдЕрдкрдиреЗ рд╕реЗрдЧрдореЗрдВрдЯ рдХреЛ рдиреНрдпреВрдирддрдо рдЖрдзрд╛рд░рднреВрдд рд╕рдВрдЦреНрдпрд╛ рдореЗрдВ рд╡рд┐рднрд╛рдЬрд┐рдд рдХрд░рддреЗ рд╣реИрдВред рд╣рдо рдмрддрд╛рддреЗ рд╣реИрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдкрд░ рдЙрдирдХреА рд╕рдВрдЦреНрдпрд╛ 2 рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред



рд╡рд┐рднрд╛рдЬрди рдореЗрдВ рд╕рдмрд╕реЗ рдмрдбрд╝рд╛ рдореМрд▓рд┐рдХ рдЦрдВрдб рд▓реЗрдВред рдЗрд╕рдХреА рд▓рдВрдмрд╛рдИ 2t рд╣реЛрдиреЗ рджреЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рд▓рдВрдмрд╛рдИ 2t рдХреЗ рдореВрд▓рднреВрдд рдЦрдВрдб рдЕрдзрд┐рдХрддрдо рджреЛ (1) рд╣реИрдВред рдмрд╛рдИрдВ рдУрд░ рдЕрдзрд┐рдХрддрдо рдЙрдкрд▓рдмреНрдз рдореМрд▓рд┐рдХ рд▓реЗ рд▓реЛред рд╣рдо рдЗрд╕реЗ рдмрд╛рдИрдВ рдУрд░ рд╕реНрдерд╛рдирд╛рдВрддрд░рд┐рдд рдХрд░реЗрдВрдЧреЗред рдзреНрдпрд╛рди рджреЗрдВ, рдлрд┐рд░ рд╕реЗ, рдХрд┐ рдЦрдВрдбреЛрдВ рдХреА рд▓рдВрдмрд╛рдИ рдШрдЯ рдЬрд╛рдПрдЧреА (2)ред рддреЛ рдпрд╣ рдЕрдзрд┐рдХрддрдо рдХреЗ рдЕрдзрд┐рдХрд╛рд░ рдХреЗ рд╕рд╛рде рд╣реИред рдЗрд╕ рдкреНрд░рдХрд╛рд░, рд╣рдо рдпрд╣ рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВ рдХрд┐ рдореВрд▓рднреВрдд рд╕реЗрдЧрдореЗрдВрдЯ рдЕрдзрд┐рдХрддрдо 2t рдкрд░ рд╣реИ, рдЬреЛ 2logn рд╕реЗ рдЕрдзрд┐рдХ рдирд╣реАрдВ рд╣реИред рдкреИрд░рд╛рдЧреНрд░рд╛рдл (1) рдФрд░ (2) рдкреНрд░рдорд╛рдг рдореЗрдВ рдореИрдВ рдЖрддреНрдо-рдкреНрд░рддрд┐рдмрд┐рдВрдм рдХреЗ рд▓рд┐рдП рдЫреЛрдбрд╝ рджреВрдБрдЧрд╛ред

рдпрд╣ рд╣рдореЗрдВ рдХреИрд╕реЗ рдорджрдж рдХрд░рддрд╛ рд╣реИ? рдЕрдм рд╣рдо рдиреАрдЪреЗ рд╕реЗ рдиреНрдпреВрдирддрдо рдЕрдиреБрд░реЛрдз рдХреЛ рд▓рд╛рдЧреВ рдХрд░ рд╕рдХрддреЗ рд╣реИрдВред рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ, рддреЛ рд╣рдо рдиреАрдЪреЗ рд╕реЗ рдКрдкрд░ рдЙрдареЗрдВрдЧреЗ, рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдкрд░ рдЙрддреНрддрд░ рдХреЗ рд▓рд┐рдП, рдПрдХ рдореВрд▓ рдЦрдВрдбред

рд╣рдореЗрдВ рджреЛ рдмрд┐рдВрджреБ рдорд┐рд▓рддреЗ рд╣реИрдВ - l рдФрд░ r, рдЬрд┐рд╕рдХреА рдорджрдж рд╕реЗ рд╣рдо рд╡рд┐рднрд╛рдЬрди рдХреЗ рдЕрдЧрд▓реЗ рдореВрд▓рднреВрдд рдЦрдВрдбреЛрдВ рдХреЛ рдкрд╛рдПрдВрдЧреЗред рдкреНрд░рд╛рд░рдВрдн рдореЗрдВ, рдХреНрд╡реЗрд░реА рдЦрдВрдб рдХреЗ рд╕рд┐рд░реЛрдВ рдХреЗ рдЕрдиреБрд░реВрдк рд╢реАрдЯ рдХреЛ рдЗрдВрдЧрд┐рдд рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП l рдФрд░ r рд╕реЗрдЯ рдХрд░реЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдпрджрд┐ рдПрд▓ рдПрдХ рд╢реАрд░реНрд╖ рдмрд┐рдВрджреБ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдХрд┐ рдЙрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рд╕рд╣реА рдкреБрддреНрд░ рд╣реИ, рддреЛ рдпрд╣ рд╢реАрд░реНрд╖ рднрд╛рдЧ рдореМрд▓рд┐рдХ рдЦрдВрдбреЛрдВ рдореЗрдВ рд╡рд┐рднрд╛рдЬрди рд╕реЗ рд╕рдВрдмрдВрдзрд┐рдд рд╣реИ, рдЕрдиреНрдпрдерд╛ рдРрд╕рд╛ рдирд╣реАрдВ рд╣реЛрддрд╛ рд╣реИред рдЗрд╕реА рддрд░рд╣ рд╕реВрдЪрдХ рдЖрд░ рдХреЗ рд╕рд╛рде - рдпрджрд┐ рдпрд╣ рдПрдХ рд╢реАрд░реНрд╖ рдмрд┐рдВрджреБ рдХреА рдУрд░ рдЗрд╢рд╛рд░рд╛ рдХрд░рддрд╛ рд╣реИ рдЬреЛ рдЗрд╕рдХреЗ рдорд╛рддрд╛-рдкрд┐рддрд╛ рдХрд╛ рдмрд╛рдпрд╛рдВ рдкреБрддреНрд░ рд╣реИ, рддреЛ рд╣рдо рдЗрд╕реЗ рд╡рд┐рднрд╛рдЬрди рдореЗрдВ рдЬреЛрдбрд╝рддреЗ рд╣реИрдВред рдЙрд╕рдХреЗ рдмрд╛рдж, рд╣рдо рджреЛрдиреЛрдВ рдмрд┐рдВрджреБрдУрдВ рдХреЛ рдПрдХ рдЙрдЪреНрдЪ рд╕реНрддрд░ рдкрд░ рд▓реЗ рдЬрд╛рддреЗ рд╣реИрдВ рдФрд░ рдСрдкрд░реЗрд╢рди рдХреЛ рджреЛрд╣рд░рд╛рддреЗ рд╣реИрдВред рд╣рдо рдСрдкрд░реЗрд╢рди рдЬрд╛рд░реА рд░рдЦрддреЗ рд╣реИрдВ рдЬрдм рддрдХ рдХрд┐ рдкреЙрдЗрдВрдЯрд░реНрд╕ рдПрдХ рдХреЗ рдмрд╛рдж рдПрдХ рдЖрддреЗ рд╣реИрдВред

рдЕрдЧрд▓реЗ рдореВрд▓рднреВрдд рд╕реЗрдЧрдореЗрдВрдЯ рдХреЛ рдЦреЛрдЬрддреЗ рд╣реБрдП, рд╣рдо рдЙрд╕ рдкрд░ рдиреНрдпреВрдирддрдо рдХреА рддреБрд▓рдирд╛ рд╡рд░реНрддрдорд╛рди рдореЗрдВ рдкрд╛рдП рдЬрд╛рдиреЗ рд╡рд╛рд▓реЗ рдиреНрдпреВрдирддрдо рд╕реЗ рдХрд░рддреЗ рд╣реИрдВ рдФрд░ рдпрджрд┐ рдЖрд╡рд╢реНрдпрдХ рд╣реЛ рддреЛ рдЗрд╕реЗ рдХрдо рдХрд░рддреЗ рд╣реИрдВред рдПрд▓реНрдЧреЛрд░рд┐рдереНрдо рдХрд╛ рд╕реНрдкрд░реНрд╢реЛрдиреНрдореБрдЦ рд╡реНрдпрд╡рд╣рд╛рд░ O (logn) рд╣реИ, рдХреНрдпреЛрдВрдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рд╕реНрддрд░ рдкрд░ рд╣рдо рдирд┐рд░рдВрддрд░ рд╕рдВрдЪрд╛рд▓рди рдХрд░рддреЗ рд╣реИрдВ, рдФрд░ рдХреБрд▓ рд╕реНрддрд░ logn рд╣реИред

 int rmq_up(vector<int>& T, int l, int r) { int ans = INF; int n = T.size() / 2; l += n - 1, r += n - 1; while (l <= r) { //  l -    , //     if (l & 1) ans = min(ans, T[l]); //  r -    , //     if (!(r & 1)) ans = min(ans, T[r]); //      l = (l + 1) / 2, r = (r - 1) / 2; } return ans; } 


рдкрд░рд┐рд╡рд░реНрддрди



рдЕрдм рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдкреЗрдбрд╝ рдХреЗ рддрддреНрд╡ рдХрд╛ рдореВрд▓реНрдп рдХреИрд╕реЗ рдмрджрд▓реЗрдВред рдзреНрдпрд╛рди рджреЗрдВ рдХрд┐ рдкреНрд░рддреНрдпреЗрдХ рдкрддреНрддреА рдХреЗ рд▓рд┐рдП рдореВрд▓ рдЦрдВрдбреЛрдВ рдХреЗ рд▓реЙрдЧ рд╣реЛрддреЗ рд╣реИрдВ рдЬреЛ рдЗрд╕рдореЗрдВ рд╕рдорд╛рд╣рд┐рдд рд╣реЛрддреЗ рд╣реИрдВ - рдпреЗ рд╕рднреА рд╣рдорд╛рд░реЗ рдкрддреНрддреА рд╕реЗ рдЬрдбрд╝ рддрдХ рдорд╛рд░реНрдЧ рдкрд░ рдкрдбрд╝реЗ рд╣реБрдП рдХреЛрдиреЗ рдХреЗ рдЕрдиреБрд░реВрдк рд╣реЛрддреЗ рд╣реИрдВред



рдЗрд╕рд▓рд┐рдП, рдПрдХ рддрддреНрд╡ рдХреЛ рдмрджрд▓рддреЗ рд╕рдордп, рдмрд╕ рдЗрд╕рдХреЗ рдкрддреНрддреЗ рд╕реЗ рдЬрдбрд╝ рддрдХ рдЬрд╛рдиреЗ рдФрд░ рд╕реВрддреНрд░ T [i] = min (T [2i], T [2i + 1]) рдХреЗ рдЕрдиреБрд╕рд╛рд░ рд░рд╛рд╕реНрддреЗ рдХреЗ рд╕рднреА рдХреЛрдиреЗ рдкрд░ рдореВрд▓реНрдп рдХреЛ рдЕрджреНрдпрддрди рдХрд░рдиреЗ рдХреЗ рд▓рд┐рдП рдкрд░реНрдпрд╛рдкреНрдд рд╣реИред

 void update(vector<int>& T, int i, int x) { int n = T.size() / 2; i += n тАУ 1; T[i] = x; while (i /= 2) T[i] = min(T[2 * i], T[2 * i + 1]); } 


рд╣реБрд░реНрд░реЗ! рд╣рдо (O (n), O (logn)) рдореЗрдВ рдЧрддрд┐рд╢реАрд▓ RMQ рд╕рдорд╕реНрдпрд╛ рдХрд╛ рд╕рдорд╛рдзрд╛рди рдкреНрд░рд╛рдкреНрдд рдХрд░рддреЗ рд╣реИрдВред

рдЕрдЧрд▓реЗ рд▓реЗрдЦ рдореЗрдВ, рд╣рдо рд╕реАрдЦреЗрдВрдЧреЗ рдХрд┐ рдКрдкрд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХреИрд╕реЗ рдХрд░реЗрдВред рдЗрд╕ рддрдереНрдп рдХреЗ рдмрд╛рд╡рдЬреВрдж рдХрд┐ рдКрдкрд░ рд╕реЗ рдЕрдиреБрд░реЛрдз рдХрд╛ рд╕реНрдкрд░реНрд╢реЛрдиреНрдореБрдЦ рдПрдХ рд╣реА рд╣реЛрдЧрд╛, рдЗрд╕рдореЗрдВ рдПрдХ рдмрдбрд╝рд╛ рдЧреЛрдЦрд░реВ рд╣реИ - рдПрдХ рдЦрдВрдб рдкрд░ рд╕рдВрд╢реЛрдзрди рдХреЛ рдЖрд╕рд╛рдиреА рд╕реЗ рдФрд░ рдЖрд╕рд╛рдиреА рд╕реЗ рдкреЗрдВрдЪ рдХрд░рдиреЗ рдХреА рдХреНрд╖рдорддрд╛ред рдЬрд▓реНрдж рдорд┐рд▓рддреЗ рд╣реИрдВ!

Source: https://habr.com/ru/post/In115026/


All Articles