Cod sursa(job #2576301)

Utilizator YetoAdrian Tonica Yeto Data 6 martie 2020 18:26:43
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.46 kb
#include <fstream>
#define dim 100001
using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int n, m, t, b, a, i, j, sol;
int A[4*dim+66], v[dim];

void build (int nod, int st, int dr)
{
    int mid;
    if (st==dr) {
        A[nod]=v[dr];
    } else {
        mid=(st+dr)/2;
        build (2*nod, st, mid);
        build (2*nod+1, mid+1, dr);
        A[nod]=max(A[2*nod], A[2*nod+1]);
    }
}

void update (int nod, int st, int dr, int p, int x)
{
    int mid;
    if (st==dr)
        A[nod]=x;
    else {
        mid=(st+dr)/2;
        if (p<=mid)
            update (2*nod, st, mid, p, x);
        else
            update (2*nod+1, mid+1, dr, p, x);
        A[nod]=max(A[2*nod], A[2*nod+1]);
    }
}

void query (int nod, int st, int dr, int a, int b, int &sol)
{
    int mid;
    if (a<=st && b>=dr) {
        sol=max(sol, A[nod]);
    } else {
        mid = (st+dr)/2;
        if (a<=mid)
            query(2*nod, st, mid, a, b, sol);
        if (b>mid)
            query(2*nod+1, mid+1, dr, a, b, sol);
    }
}

int main () {
    fin>>n>>m;
    for (i=1;i<=n;i++) {
        fin>>v[i];
    }
    build (1, 1, n);
    for (i=1;i<=m;i++) {
        fin>>t>>a>>b;
        if (t==0) {
            //query
            sol=-1;
            query(1, 1, n, a, b, sol);
            fout<<sol<<"\n";
        } else {
            //update
            update(1, 1, n, a, b);
        }
    }



    return 0;
}