Nu aveti permisiuni pentru a descarca fisierul grader_test10.ok
Cod sursa(job #1776979)
Utilizator | Data | 11 octombrie 2016 23:11:15 | |
---|---|---|---|
Problema | SequenceQuery | Scor | 100 |
Compilator | cpp | Status | done |
Runda | Arhiva de probleme | Marime | 1.85 kb |
#include <cstdio>
using namespace std;
FILE *fin;
const int MAXN = 100001;
struct Node {
long long pref, suff, sum, ssm;
};
Node aint[4 * MAXN];
inline long long maximum(long long a, long long b) {
if (a < b)
return b;
return a;
}
void init_dfs(int node, int left, int right) {
if (left == right) {
int num;
fscanf(fin, "%d", &num);
aint[node] = {num, num, num, num};
return;
}
int mid = (left + right) / 2;
init_dfs(2 * node, left, mid);
init_dfs(2 * node + 1, mid + 1, right);
aint[node].sum = aint[2 * node].sum + aint[2 * node + 1].sum;
aint[node].pref = maximum(aint[2 * node].pref, aint[2 * node].sum + aint[2 * node +1].pref);
aint[node].suff = maximum(aint[2 * node + 1].suff, aint[2 * node + 1].sum + aint[2 * node].suff);
aint[node].ssm = maximum(aint[2 * node].ssm, aint[2 * node + 1].ssm);
aint[node].ssm = maximum(aint[node].ssm, aint[2 * node].suff + aint[2 * node + 1].pref);
}
long long ans, curr;
int x, y;
void query(int node, int left, int right) {
if (x <= left && right <= y) {
curr = maximum(0LL, curr);
ans = maximum(ans, aint[node].ssm);
ans = maximum(ans, aint[node].pref + curr);
curr = maximum(aint[node].suff, curr + aint[node].sum);
return;
}
int mid = (left + right) / 2;
if (x <= mid)
query(2 * node, left, mid);
if(mid < y)
query(2 * node + 1, mid + 1, right);
}
const long long NEG_INF = -1e11;
int main()
{
FILE *fout;
int n, m, i;
fin = fopen("sequencequery.in", "r");
fscanf(fin, "%d%d", &n, &m);
init_dfs(1, 1, n);
fout = fopen("sequencequery.out", "w");
for (i = 0; i < m; ++i) {
fscanf(fin, "%d%d", &x, &y);
curr = 0LL; ans = NEG_INF;
query(1, 1, n);
fprintf(fout, "%lld\n", ans);
}
fclose(fin);
fclose(fout);
return 0;
}