Cod sursa(job #1570428)

Utilizator Emy1337Micu Emerson Emy1337 Data 16 ianuarie 2016 15:31:33
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

const int MAXN =100100;


int n,m;
/*
nodStart (1, n) - 1
2 - (1, n/2), 3 - (n/ 2 + 1, n)
4 -(1, n/4), 5 - (n/4 + 1, n/2), 6 - (n/2 + 1, ) 7
8


nod - nr
nodFiu Stanga = nr  *2
nodFiu Dreapta = nr * 2 + 1*/

class aint {

    public:

    aint() {
        fill(v + 1, v + 3 * n + 1, 0);
    }

    int update_public(int poz, int x) {
        update(1, 1, n, poz, x);
    }

    int query_public(int left, int right) {
        return query(1, 1, n, left, right);
    }

    private:

    int v[4 * MAXN];

    void update (int nod, int st, int dr, int poz, int x)
    {
        if (st == dr)
        {
            v[nod] = x;
            return;
        }
        int m = (st + dr) / 2;
        int nodStanga = nod * 2;
        int nodDreapta = nod * 2 + 1;

        if (poz <= m)
            update (nodStanga, st, m, poz, x);
        else
            update (nodDreapta, m + 1, dr, poz, x);

        v[nod] = max(v[nodStanga], v[nodDreapta]);
    }

    int query (int nod, int st, int dr, int left, int right)
    {
        if (left <= st && dr <= right)
            return v[nod];

        int m = (st + dr) / 2;
        int nodStanga = nod * 2;
        int nodDreapta = nod * 2 + 1;

        int rez = -1;

        if (left <= m)
            rez = max(rez, query(nodStanga, st, m, left, right));
        if (right > m)
            rez = max(rez, query(nodDreapta, m + 1, dr, left, right));

        return rez;
    }
};


aint a;


int main()
{
    fin>>n>>m;
    for(int i=1;i<=n;i++){
       int x; fin>>x;
       a.update_public(i,x);
    }
    for(int i=1;i<=m;i++){
        int tip,x,y;
        fin>>tip>>x>>y;
        if(tip)
            a.update_public(x,y);
        else
            fout<<a.query_public(x,y)<<"\n";
    }

}