* 3ボード
書式#include <iostreamの> の#include <cstdioを> する#include <CStringの> の#include <cmath> に#define int型、長い長い 使って 名前空間はstdを、 INTの N、Q、H [ 500050 ]、DP1 [ 500050 ] [ 65 ]、DP2 [ 500050 ] [ 65 ]。 無効INITを() { ため(int型 I = 1 DP1を[I] [iが++; iが<= N)0 ] =をH [i]は、 用(INT J = 1 ;(1 << J)<= nであり、j ++ ) のために(int型 iは= 1 ; I +(1 << J) - 1 <= N; iは++ ) DP1 [I] [J] = MAX(DP1 [I]、[J- 1 ]、DP1を[I +(1 << J- 1)] [J- 1 ])。 以下のために(int型 i = 1 ; iが<= N; iは++)DP2を[I] [ 0 ] =をH [i]は、 用(INTの J = 1 ;(1 << J)<= nであり、j ++ ) のための(INT I = 1、I +(1 << J) - 1 <= N; iは++ ) DP2 [I] [J] }=分(DP2 [i]は[J- 1 ]、DP2 [iが+(1 << J- 1)] [J- 1 ])。 } INT MAXNUM(INT L、int型R) { int型 K = LOG2(R-L + 1 )。 戻り MAX(DP1 [L] [K]、DP1 [R-(1 << k)を+ 1 ] [K])。 } INT minnum(INT L、INT R) { int型 kは= LOG2(R-L + 1 )。 戻り分(DP2 [L] [K]、DP2 [R-(1 << k)を+ 1 ] [K])。 main()の符号付き { scanf関数(" %のLLDの%のLLD "、&N、&Q)。 以下のために(int型 i = 1 ; iが<= N; iは++)scanf関数を(" %のLLD "、&H [I])。 その中に(); INT X、Y。 以下のために(int型 I = 1 ; I <= Q; iは++ ) { scanf関数(" %のLLDの%のLLD "、およびX&Y)。 printf(" %LLDする\ n "、MAXNUM(X、Y) - minnum(X、Y))。 } 戻り 0 。 }