Cod sursa(job #1906237)

Utilizator zeboftwAlex Mocanu zeboftw Data 6 martie 2017 12:52:51
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <iostream>
#include <fstream>

using namespace std;

int maxArb[100000], pos, val, start, finish, maxim;

ifstream fin("scmax.in");
ofstream fout("scmax.out");

inline int maximum(int a , int b) {
    if(a < b) return b;
    else return a;
}

inline int father(int nod) {
    return nod / 2;
}

inline int lson (int nod) {
    return nod * 2;
}

inline int rson (int nod) {
    return nod * 2 + 1;
}

void Update (int nod, int left, int right) {
    cout << left << "-" << right << '\n';
    if (left == right) {
        maxArb[nod] = val;
        return;
    }

    int div = (left + right) / 2;

    if (pos <= div) Update(lson(nod),left,div);
    else            Update(rson(nod),div+1,right);
    cout << left << "-" << right << '\n';
    maxArb[nod] = maximum(maxArb[lson(nod)], maxArb[rson(nod)]);
    cout << "merge" << '\n';
}

void Querry (int nod, int left, int right) {
    if (start <= left && finish <= right) {
        if (maxim < maxArb[nod]) maxim = maxArb[nod];
        return;
    }
    int div = (left+right) / 2;
    if (start <= div) Querry(lson(nod),left,div);
    if (finish > div) Querry(rson(nod),div+1,right);
}

int main()
{
    int n, m;

    fin >> n >> m;

    for (int i=1; i <= n; i++) {
        fin >> val;
        pos = i;
        Update(1,1,n);
    }

    for (int i=1; i <= m; i++) {
        int x,a,b;
        fin >> x >> a >> b;
        if (x) {
            pos = a; val = b;
            Update(1,1,n);
        }
        else {
            start = a; finish = b;
            maxim = -1;
            Querry(1,1,n);
            cout << maxim << '\n';
        }
    }

    return 0;
}