Pagini recente » Cod sursa (job #1789475) | Cod sursa (job #2819377) | Cod sursa (job #2930838) | Cod sursa (job #880260) | Cod sursa (job #2583396)
#include <fstream>
#define N 100001
using namespace std;
ifstream f ( "sequencequery.in" );
ofstream g ( "sequencequery.out" );
const long long inf = 1000000000000ll;
struct arbore{
long long smax, suma, sst, sdr;
}ait[3 * N];
int v[N], a, b;
long long S, ans;
void build ( int node, int st, int dr ){
if ( st == dr ){
ait[node].smax = ait[node].sst = ait[node].sdr = ait[node].suma = v[st];
return;
}
int mid = ( st + dr ) >> 1;
build ( 2 * node, st, mid );
build ( 2 * node + 1, mid + 1, dr );
ait[node].suma = ait[2 * node].suma + ait[2 * node + 1].suma;
ait[node].smax = max ( max ( ait[2 * node].smax, ait[2 * node + 1].smax ), ait[2 * node].sdr + ait[2 * node + 1].sst );
ait[node].sst = max ( ait[2 * node].sst, ait[2 * node].suma + ait[2 * node + 1].sst );
ait[node].sdr = max ( ait[2 * node + 1].sdr, ait[2 * node + 1].suma + ait[2 * node].sdr );
}
void quary ( int node, int st, int dr ){
if ( a <= st && dr <= b ){
ans = max ( ans, max ( S + ait[node].sst, ait[node].smax ) );
S = max ( S + ait[node].suma, ait[node].sdr );
return;
}
int mid = ( st + dr ) >> 1;
if ( a <= mid )
quary ( 2 * node, st, mid );
if ( mid + 1 <= b )
quary ( 2 * node + 1, mid + 1, dr );
}
int main()
{ int n, i, m;
f >> n >> m;
for ( i = 1; i <= n; i++ )
f >> v[i];
build ( 1, 1, n );
for ( i = 1; i <= m; i++ ){
f >> a >> b;
ans = -inf;
S = 0;
quary ( 1, 1, n );
g << ans << '\n';
}
return 0;
}