Cod sursa(job #1129682)

Utilizator klamathixMihai Calancea klamathix Data 28 februarie 2014 02:17:55
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.2 kb
#include <iostream>
#include <vector>
#include <fstream>
using namespace std;
const int maxn = 1e5 + 5;
int n, m;
vector<int> v, aib;

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

int query(int a, int b) {

    int ans = -1;
    if(a > b)
        return ans;

    while(b != a) {
        if(b - lsb(b) >= a) {
            ans = max(ans, aib[b]);
            b -= lsb(b);
        } else {
            ans = max(ans, v[b]);
            b--;
        }
    }

    ans = max(ans, v[a]);
    return ans;
}


void update(int poz, int value) {
    v[poz] = value;
    //int init = poz;

    while(poz <= n) {
        int lf = query(poz - lsb(poz) + 1, poz - 1);
        aib[poz] = max(lf, v[poz]);
        poz += lsb(poz);
    }
}

int main() {
   
    #ifdef INFOARENA
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    #endif

    cin >> n >> m;
    v = vector<int> (n + 1, 0);
    aib = vector<int> (n + 1, -1);

    for(int i = 1; i <= n; ++i) {
        cin >> v[i];
        update(i, v[i]);
    }

    for(int i = 1; i <= m; ++i) {
        int type; cin >> type;
        int a, b; cin >> a >> b;
        if(type == 0)
            cout << query(a, b) << "\n";
        else
            update(a, b);
    }
}