Pagini recente » Cod sursa (job #2582044) | Cod sursa (job #304534) | Cod sursa (job #1232253) | Cod sursa (job #2201256) | Cod sursa (job #3200316)
#include <fstream>
#include <math.h>
#include <algorithm>
#define UPDATE 0
#define MAX 1
#define MAX_N 100001
const int SQ_N = sqrt(MAX_N);
const int BATOG_SIZE = (MAX_N + SQ_N - 1) / SQ_N;
int v[MAX_N], vLength, batog[BATOG_SIZE];
void build() {
int i;
for (i = 0; i < vLength; ++i)
batog[i / SQ_N] += v[i];
}
inline void update(int pos, int value) {
batog[pos / SQ_N] += value - v[pos];
v[pos] = value;
}
int query(int left, int right) {
int firstInterval, lastInterval, result;
firstInterval = (left + SQ_N - 1) / SQ_N * SQ_N;
lastInterval = right / SQ_N * SQ_N;
result = 0;
while (left <= right && left < firstInterval)
result += v[left++];
while (right >= left && right >= lastInterval)
result += v[right--];
firstInterval /= SQ_N;
lastInterval /= SQ_N;
while (firstInterval < lastInterval)
result = max(result, batog[firstInterval++]);
return result;
}
int main() {
int q, op, a, b;
fin>>vLength;
for (int i = 0; i < vLength; ++i)
fin>>v[i];
build();
fin>>q;
while (q--) {
fin>>op>>a>>b);
if (op == UPDATE)
update(a, b);
else
if (op == MAX)
fout<<query(a, b)<<'\n';
}
return 0;
}