Cod sursa(job #2151680)

Utilizator SolcanMihaiSolcan Mihai Andrei SolcanMihai Data 4 martie 2018 19:02:48
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <cstdio>
#include <algorithm>

using namespace std;

int n, m;
int sirx[100004];

struct Arbore{
    int sir[400004];

    int insertInitial(int poz, int st, int dr){
        if(st == dr){
            sir[poz] = sirx[st];
            return sir[poz];
        }
        else{
            int m = (st + dr) / 2;
            sir[poz] = max(insertInitial(poz * 2, st, m), insertInitial(poz * 2 + 1, m + 1, dr));
            return sir[poz];
        }
    }

    void insertx(int poz, int st, int dr, int val, int pozx){
        if(st == dr){
            sir[poz] = val;
        }
        else{
            int m = (st + dr) / 2;
            int valx;

            if(m >= pozx){
                insertx(poz * 2, st, m, val, pozx);
                valx = sir[poz * 2 + 1];
            }
            else{
                insertx(poz * 2 + 1, m + 1, dr, val, pozx);
                valx = sir[poz * 2];
            }

            sir[poz] = max(valx, val);
        }
    }

    int querry(int poz, int st, int dr, int stx, int drx){
        if(st >= stx && dr <= drx){
            return sir[poz];
        }
        int m = (st + dr) / 2;
        int val = 0;

        if(m >= stx){
            val = max(val, querry(poz * 2, st, m, stx, drx));
        }

        if(m < drx){
            val = max(val, querry(poz * 2 + 1, m + 1, dr, stx, drx));
        }

        return val;
    }

    Arbore(){
        insertInitial(1, 1, n);
    }
};

void citire(){
    scanf("%d %d", &n, &m);

    for(int i = 1; i <= n; i++){
        scanf("%d", &sirx[i]);
    }
}

int main()
{
    freopen("arbint.in", "r", stdin);
    freopen("arbint.out", "w", stdout);

    citire();
    Arbore arbore;
    int x, y, z;

    for(int k = 0; k < m; k++){
        scanf("%d %d %d", &x, &y, &z);

        if(x == 0){
            printf("%d\n", arbore.querry(1, 1, n, y, z));
        }
        else if(x == 1){
            arbore.insertx(1, 1, n, z, y);
        }
    }


    return 0;
}