Pagini recente » Cod sursa (job #691851) | Cod sursa (job #483406) | Cod sursa (job #502056) | Cod sursa (job #1514881) | Cod sursa (job #1275263)
#include <iostream>
#include <fstream>
using namespace std;
ifstream f ("sequencequery.in");
ofstream g ("sequencequery.out");
struct Nod {
int prefix, sufix, suma, rezultat;
};
const int NMAX = 100000 + 1;
int n, m, a, b, valoare, poz, sol;
Nod arb[4 * NMAX];
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].prefix = max(arb[2 * nod].prefix, arb[2 * nod + 1].prefix + arb[2 * nod].suma);
arb[nod].sufix = max(arb[2 * nod + 1].sufix, arb[2 * nod].sufix + arb[2 * nod + 1].suma);
arb[nod].suma = arb[2 * nod].suma + arb[2 * nod + 1].suma;
arb[nod].rezultat = max(arb[2 * nod].rezultat, arb[2 * nod + 1].rezultat);
arb[nod].rezultat = max(arb[nod].rezultat, arb[2 * nod].sufix + arb[2 * nod + 1].prefix);
}
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) {
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;
}
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;
}