Cod sursa(job #1148268)

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

const int N = 1 + 1e5;

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

    inline int lsb(const int x){
        return x & -x;
    }
public:
    void init(int n){
        size = n;
    }

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

    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, front[x]);
                x += p;
            }
            if (y & p){
                ans = max(ans, back[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;
}