Pagini recente » Cod sursa (job #2424098) | Cod sursa (job #2880633) | Cod sursa (job #1996242) | Cod sursa (job #2115214) | Cod sursa (job #1602446)
#include <fstream>
#include <iostream>
#include <climits>
#define sub -2000000
using namespace std;
ifstream fin("sequencequery.in");
ofstream fout("sequencequery.out");
int v[400000];
int n, m, pos, val, start, stop;
__int64 sum;
void update(int nod, int left, int right){
if(left == right){
v[nod] = val;
return;
}
int mij = (left + right) / 2;
if(pos <= mij)
update(nod * 2, left, mij);
else
update(nod * 2 + 1, mij + 1, right);
v[nod] = max(v[2 * nod], v[2 * nod + 1]);
v[nod] = max(v[nod], v[2 * nod] + v[2 * nod + 1]);
}
void query(int nod, int left, int right){
if(left > stop || right < start){
return;
}
if(start <= left && right <= stop){
sum = max(1LL * v[nod], sum + v[nod]);
return;
}
int mij = (left + right) / 2;
query(nod * 2, left, mij);
query(nod * 2 + 1, mij + 1, right);
}
int main()
{
//for(int i = 1; i <= n; ++i) v[i] = sub;
fin >> n >> m;
for(int i = 1; i <= n; ++i){
fin >> val;
pos = i;
update(1, 1, n);
}
//for(int i = 1; i <= 2 * n; ++i)
//fout << v[i] << ' ';
for(int i = 1; i <= m; ++i){
fin >> start >> stop;
sum = INT_MIN;
query(1, 1, n);
fout << sum << '\n';
}
return 0;
}