Cod sursa(job #1798425)

Utilizator ionanghelinaIonut Anghelina ionanghelina Data 5 noiembrie 2016 10:59:26
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <fstream>
#include<climits>
#define maxN 100005
using namespace std;
int A[4*maxN+5],v[maxN],sol,i,n,m,op,a,b;
ifstream fin ("arbint.in");
    ofstream fout("arbint.out");
void build(int nod, int st, int dr) {
    if (st == dr)
        A[nod] = v[st];
    else {
        int 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) {
    if (st == dr)
        A[nod] = x;
    else {
        int mid = (st+ dr)/2;
        if (p <= mid)
            update(2*nod, st, mid, p, x);
        if (p > mid)
            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) {
    if (a <= st && dr <= b)
        sol = max(sol, A[nod]);
    else {
        int mid = (st+ dr)/2;
        if (a <= mid)
            query(2*nod, st, mid, a, b);
        if (b > mid)
            query(2*nod+1, mid+1, dr, a, b);
    }

}


int main () {


    fin>>n>>m;
    for (i=1;i<=n;i++)
        fin>>v[i];
    build(1, 1, n);
    for(int i=1;i<=m;i++)
    {
        fin>>op>>a>>b;
        if(op==0)
        {
            sol=0;
            query(1,1,n,a,b);
              fout<<sol<<'\n';
        }
            else
        {
            update(1,1,n,a,b);
        }
    }
    return 0;
}