Cod sursa(job #1097667)

Utilizator muresan_bogdanMuresan Bogdan muresan_bogdan Data 3 februarie 2014 19:35:00
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include<iostream>
#include<fstream>
using namespace std;

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

struct seg {
    int left, right;
};

struct nod{
    seg interval;
    int maxim;
};

int n, m, i, a, b, k, poz[200001], aux, rez;
nod v[262144];

void split(seg x, int nodul) {
    seg stanga, dreapta;
    int mij = (x.left + x.right) / 2;
    stanga.left = x.left;
    stanga.right = mij;
    dreapta.left = mij + 1;
    dreapta.right = x.right;
    v[nodul*2].interval = stanga;
    v[nodul*2 + 1].interval = dreapta;
    if(stanga.left != stanga.right) {
        split(stanga, nodul*2);
    }
    else {
        poz[stanga.left] = nodul*2;
    }
    if(dreapta.left != dreapta.right) {
        split(dreapta, nodul*2 + 1);
    }
    else {
        poz[dreapta.left] = nodul*2 + 1;
    }
}

void infuz(int nodul, int val) {
    v[nodul].maxim = val;

    if(nodul%2) {
        aux = max(v[nodul].maxim, v[nodul - 1].maxim);
    }
    else {
        aux = max(v[nodul].maxim, v[nodul + 1].maxim);
    }
    if(aux != v[nodul/2].maxim) {
        infuz(nodul/2, aux);
    }
}

void ask(int y) {
    nod x = v[y];
    if((a <= x.interval.left) && (b >= x.interval.right)) {
        if(x.maxim > rez) {
            rez = x.maxim;
        }
    }
    else {
        int mij = (x.interval.left + x.interval.right) / 2;
        if(a <= mij) {
            ask(y * 2);
        }
        if(b > mij) {
            ask(y * 2 + 1);
        }
    }
}

int main() {
    fin >> n >> m;
    v[1].interval = seg{1, n};
    split(v[1].interval, 1);
    for(i = 1; i <= n; i++) {
        fin >> aux;
        infuz(poz[i], aux);
    }
    for(i = 0; i < m; i++) {
        fin >> k >> a >> b;
        if(k == 0) {
            rez = 0;
            ask(1);
            fout << rez << '\n';
        }
        if(k == 1) {
            infuz(poz[a], b);
        }
    }
    fin.close();
    fout.close();
    return 0;
}