Pagini recente » Istoria paginii preoji/clasament/9 | Cod sursa (job #2355447) | Statistici Sebastian George (prajitu) | Cod sursa (job #2167645) | Cod sursa (job #1275265)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("sequencequery.in");
ofstream g ("sequencequery.out");
struct Nod {
long long prefix, sufix, suma, rezultat;
};
const int NMAX = 100000 + 1;
int n, m, a, b;
long long valoare, poz, sol;
Nod arb[4 * NMAX];
Nod nod_nou(Nod stanga, Nod dreapta) {
Nod aux;
aux.suma = stanga.suma + dreapta.suma;
aux.prefix = max(stanga.prefix, stanga.suma + dreapta.prefix);
aux.sufix = max(dreapta.sufix, dreapta.suma + stanga.sufix);
aux.rezultat = max(stanga.rezultat, dreapta.rezultat);
aux.rezultat = max(aux.rezultat, stanga.sufix + dreapta.prefix);
return aux;
}
void update(int nod, int st, int dr) {
if (st == dr) {
arb[nod].prefix = arb[nod].sufix = arb[nod].suma = arb[nod].rezultat = valoare;
return;
}
int m = (st + dr) / 2;
if (poz <= m) update(2 * nod, st, m);
else update(2 * nod + 1, m + 1, dr);
arb[nod] = nod_nou(arb[2 * nod], arb[2 * nod + 1]);
}
Nod query(int nod, int st, int dr) {
if (a <= st && dr <= b) return arb[nod];
bool fiu_stang = false, fiu_drept = false;
Nod stanga, dreapta;
int m = (st + dr) / 2;
if (a <= m) {
fiu_stang = true;
stanga = query(2 * nod, st, m);
}
if (m < b) {
fiu_drept = true;
dreapta = query(2 * nod + 1, m + 1, dr);
}
if (fiu_stang && fiu_drept) {
return nod_nou(stanga, dreapta);
}
if (fiu_drept) return dreapta;
return stanga;
}
void citeste() {
f >> n >> m;
for (int i = 1; i <= n; i++) {
f >> valoare;
poz = i;
update(1, 1, n);
}
}
void rezolva() {
Nod sol;
for (int i = 1; i <= m; i++) {
f >> a >> b;
sol = query(1, 1, n);
g << sol.rezultat << '\n';
}
}
int main() {
citeste();
rezolva();
return 0;
}