Cod sursa(job #2289221)

Utilizator CronosClausCarare Claudiu CronosClaus Data 24 noiembrie 2018 11:57:04
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.6 kb
#include <bits/stdc++.h>

using namespace std;

const int mxn = 100 * 1000 + 10;

int a[ 4 * mxn ];
int v[ mxn ];

int n, q;
int h;
int p, st, sf;
int mx;

void build(int x, int y, int nod){
    if(x == y){
        a[ nod ] = v[ x ];
    }
    else{
        int mid = (x + y) / 2;
        build(x, mid, 2 * nod);
        build(mid + 1, y, 2 * nod + 1);
        a[ nod ] = max(a[ 2 * nod ], a[ 2 * nod + 1]);
    }
}

int update(int x, int y, int nod){
    if(x == y){
        a[ nod ] = v[ x ];
    }
    else{
        int mij = (x + y) / 2;
        if(p <= mij){
            update(x, mij, 2 * nod);
        }
        else{
            update(mij + 1, y, 2 * nod + 1);
        }
        a[ nod ] = max(a[ 2 * nod ], a[ 2 * nod + 1]);
    }
}

int query(int x, int y, int nod){
    if(st <= x && y <= sf){
        return a[ nod ];
    }
    else{
        int mij = (x + y)/2;
        int mx1 = -1, mx2 = -1;
        if(st <= mij)
            mx1 = query(x, mij, 2 * nod);
        if(mij < sf)
            mx2 = query(mij + 1, y, 2 * nod + 1);
        return max(mx1, mx2);
    }
}

int main()
{
    ifstream cin("arbint.in");
    ofstream cout("arbint.out");
    cin>> n >> q;
    for(int i = 1; i <= n; i++){
        cin>> v[ i ];
    }
    build(1, n, 1);
    for(int i = 1, k, x, y; i <= q; i++){
        cin>> k >> x >> y;
        if(k == 0){
            st = x;
            sf = y;
            cout<< query(1, n, 1) << '\n';
        }
        else{
            v[ x ] = y;
            p = x;
            update(1, n, 1);
        }
    }
    return 0;
}