Cod sursa(job #2051614)

Utilizator gapdanPopescu George gapdan Data 29 octombrie 2017 12:34:07
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.61 kb
#include <fstream>
#define NMAX 100005

using namespace std;

int aint[NMAX*10];
int v[NMAX];
int n,m;

void construct(int nod, int st, int dr) {
    if (st > dr) return;
    if (st == dr) {
        aint[nod] = v[st];
        return;
    }
    int mij = st + (dr - st) / 2;
    construct(nod * 2, st, mij);
    construct(nod * 2 + 1, mij + 1, dr);
    aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}
int M = 0;
void query(int nod, int l, int r, int st, int dr) {
    if (st >= l && dr <= r) {
        M = max(M, aint[nod]);
        return;
    }
    if (st > r || dr < l || st > dr) return;
    int mij = st + (dr - st) / 2;
    query(nod * 2, l, r, st, mij);
    query(nod * 2 + 1, l, r, mij + 1, dr);
}

void update(int nod, int st, int dr, int poz) {
    if (st == dr) {
        aint[nod] = v[st];
        return;
    }
    if (st > dr) {
        return;
    }
    int mij = st + (dr - st) / 2;
    if (mij >= poz) update(nod * 2, st, mij, poz);
    if (mij < poz) update(nod * 2 + 1, mij + 1, dr, poz);
    aint[nod] = max(aint[nod * 2], aint[nod * 2 + 1]);
}

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