Cod sursa(job #3200316)

Utilizator conttest12cont de test conttest12 Data 4 februarie 2024 12:32:15
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.31 kb
#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;
}