Cod sursa(job #1232956)

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

#define NMax 100005

using namespace std;

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

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

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

void Query(int nod, int left, int right) {

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

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

void Update(int nod, int left, int right) {

    if (left == right) {
        MaxArb[nod] = valueToUpdate;
        return;
    }

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

    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;
}