Cod sursa(job #1148433)

Utilizator mihai995mihai995 mihai995 Data 20 martie 2014 19:29:22
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 2.06 kb
#include <fstream>
using namespace std;

const int N = 1 + 1e5, obsolete = -1;

class MonoAib{
    int front[N], back[N], value[N], size;

    inline int lsb(const int x){
        return x & -x;
    }

    inline int requestBack(int x){
        if ( back[x] == obsolete )
            back[x] = max( value[x], query(x - lsb(x) + 1, x - 1) );
        return back[x];
    }

    inline int requestFront(int x){
        if ( front[x] == obsolete )
            front[x] = max( value[x], query(x + 1, x - lsb(x) - 1) );
        return front[x];
    }
public:
    void init(int n){
        size = n;
    }

    void update(int x, int val){
        if ( val < value[x] ){
            for (int i = x ; i <= size ; i += lsb(i))
                if ( back[i] == value[x] )
                    back[i] = obsolete;
            for (int i = x ; i ; i -= lsb(i))
                if ( front[i] == value[x] )
                    front[i] = obsolete;
        } else {
            for (int i = x ; i <= size ; i += lsb(i))
                back[i] = max( back[i], val );
            for (int i = x ; i ; i -= lsb(i))
                front[i] = max( front[i], val );
        }
        value[x] = val;
    }

    int query(int x, int y){
        if (y < x)
            return 0;

        int ans = 0, p;
        while (x != y){
            p = lsb(x | y);

            if (x & p){
                ans = max( ans, requestFront(x) );
                x += p;
            }
            if (y & p){
                ans = max(ans, requestBack(y) );
                y -= p;
            }
        }

        return max(ans, value[x]);
    }
};

MonoAib A;

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

int main(){
    int n, nrQ, tip, x, y;

    in >> n >> nrQ;
    A.init(n);

    for (int i = 1 ; i <= n ; i++){
        in >> x;
        A.update(i, x);
    }

    while (nrQ--){
        in >> tip >> x >> y;

        if (tip == 1)
            A.update(x, y);
        else
            out << A.query(x, y) << '\n';
    }

    return 0;
}