Cod sursa(job #1193800)

Utilizator mihai995mihai995 mihai995 Data 1 iunie 2014 20:25:11
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
using namespace std;

const int N = 1 + 2e5, LG = 17;

class Aint{
    int aint[2 * N];

    inline static int getPos(int n){
        return 2 * (n - 1) - __builtin_popcount(n - 1);
    }
public:
    void update(int x, int val){
        aint[ getPos(x) ] = val;
        for (int i = 0, step = 1 ; i < LG ; i++, step <<= 1){
            if ( x & step )
                x += step;
            aint[ getPos(x) + i + 1 ] = max( aint[ getPos(x) + i ], aint[ getPos(x - step) + i ] );
        }
    }

    int query(int x, int y){
        x--;
        int ans = 0, p;
        while (x != y){
            p = __builtin_ctz( x | y );

            if (x & (1 << p)){
                ans = max(ans, aint[ getPos(x + (1 << p)) + p ]);
                x += 1 << p;
            }
            if (y & (1 << p)){
                ans = max(ans, aint[ getPos(y) + p ]);
                y ^= 1 << p;
            }
        }
        return ans;
    }
};

Aint A;

int main(){
    int n, nrQ, tip, x, y;
    ifstream in("arbint.in");

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

    ofstream out("arbint.out");
    while (nrQ--){
        in >> tip >> x >> y;

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

    out.close();
    in.close();

    return 0;
}