Cod sursa(job #1232934)

Utilizator catalincraciunCraciun Catalin catalincraciun Data 24 septembrie 2014 12:33:40
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.64 kb
/// Craciun Catalin
///  Arbori de intervale
///   Arhiva educationala
#include <iostream>
#include <fstream>

#define NMax 100005

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int n,m;
int positionToUpdate, valueToUpdate;
int MaxArb[4*NMax + 100];
int start, finish;
int maxim = -1;

inline int maxBetweenXY (int x, int y) { if (x > y) return x; return y; }

void Query (int nod, int st, int dr) {

    if (start <= st && dr <= finish) {
        if (maxim < MaxArb[nod]) maxim = MaxArb[nod];
        return;
    }

    int mij = (st + dr)/2;
    if (start <= mij)  Query(2*nod, st, mij);
    if (mij < finish)   Query(2*nod+1, mij+1, dr);
}

void Update (int nod, int st, int dr) {

    if (st == dr) {
        MaxArb[nod] = valueToUpdate;
        return;
    }

    int mij = (st+dr)/2;
    if (positionToUpdate<=mij)
        Update(2*nod, st, mij);
    else
        Update(2*nod+1, mij+1, dr);

    MaxArb[nod] = maxBetweenXY (MaxArb[2*nod], MaxArb[2*nod+1]);
}

int main() {

    f>>n>>m;
    for (int i=1;i<=n;i++) {
        int x;
        f>>x;

        positionToUpdate = i;
        valueToUpdate = x;

        Update(1,1,n);
    }

    for (int i=1;i<=m;i++) {
        int type;
        f>>type;
        if (type == 0) {
            int a, b;
            f>>a>>b;
            start = a;
            finish = b;
            maxim = -1;
            Query(1, 1, n);

            g<<maxim<<'\n';
        } else if (type == 1) {
            f>>positionToUpdate>>valueToUpdate;
            Update(1,1,n);
        }
    }

    f.close(); g.close();

    return 0;
}