Cod sursa(job #1356896)

Utilizator depevladVlad Dumitru-Popescu depevlad Data 23 februarie 2015 17:21:35
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.62 kb
#include <cstdio>
#include <cstring>
#include <algorithm>

using namespace std;

#define MAX_NODES 500000
#define inFile "arbint.in"
#define outFile "arbint.out"

int qANS;
class SegmentTree {
private:
    int sTree[MAX_NODES];
public:
    SegmentTree();
    void Update(int X, int L, int R, int Pos, int Val);
    void Query(int X, int L, int R, int i, int j);
};

SegmentTree :: SegmentTree() {
    memset(sTree, 0, sizeof(sTree));
}

void SegmentTree :: Update(int X, int L, int R, int Pos, int Val) {
    if(L == R) {
        sTree[X] = Val;
        return;
    }
    int Mid = (L+R)>>1;
    if(Pos <= Mid)
        Update(2*X, L, Mid, Pos, Val);
    else
        Update(2*X+1, Mid+1, R, Pos, Val);
    sTree[X] = max(sTree[2*X], sTree[2*X+1]);
}

void SegmentTree :: Query(int X, int L, int R, int i, int j) {
    if(i <= L && R <= j) {
        qANS = max(qANS, sTree[X]);
        return;
    }
    int Mid = (L+R)>>1;
    if(i <= Mid)
        Query(2*X, L, Mid, i, j);
    if(j > Mid)
        Query(2*X+1, Mid+1, R, i, j);
}

int main() {
    freopen(inFile, "r", stdin);
    freopen(outFile, "w", stdout);
    
    int N, M, i, A, B, op;
    SegmentTree Tree;
    
    scanf("%d %d", &N, &M);
    for(i = 1; i <= N; i++) {
        scanf("%d", &A);
        Tree.Update(1, 1, N, i, A);
    }
    
    for(i = 1; i <= M; i++) {
        scanf("%d %d %d", &op, &A, &B);
        if(op == 0) {
            qANS = 0;
            Tree.Query(1, 1, N, A, B);
            printf("%d\n", qANS);
        }
        else 
            Tree.Update(1, 1, N, A, B);
    }
    
    return 0;
}