Cod sursa(job #1961504)

Utilizator DobosDobos Paul Dobos Data 11 aprilie 2017 10:16:41
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.77 kb
#include <bits/stdc++.h>
#define NMAX 100005
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

class Arbmin{
    protected :
    int V[4 * NMAX],v[NMAX];
    public :
    int N,Q,sol;
    void BuildArb(int,int,int);
    void Read();
    void Update(int,int,int,int,int);
    void Solution(int,int,int,int,int);

}A;

void Arbmin :: Read(){

    fin >> N >> Q;

    for(int i = 1; i <= N; i++)
        fin >> v[i];
}
void Arbmin :: BuildArb(int nod,int L,int R){

    if(L == R){
        V[nod] = v[L];
        return;
    }

    int mid = (L + R) >> 1;

    BuildArb(nod << 1,L,mid);
    BuildArb((nod << 1) + 1,mid + 1,R);

    V[nod] = max(V[nod << 1],V[(nod << 1) + 1]);

}

void Arbmin :: Update(int nod,int L,int R,int p,int x){

    if(L == R){
        V[nod] = x;
        return;
    }

    int mid = (L + R) >> 1;

    if(p <= mid)
        Update(nod << 1,L,mid,p,x);
    else
        Update((nod << 1) + 1,mid + 1,R,p,x);

     V[nod] = max(V[nod << 1],V[(nod << 1) + 1]);

}

void Arbmin :: Solution(int nod,int L,int R,int m,int M){

    if(m <= L && M >= R){
        A.sol = max(A.sol,V[nod]);
        return;
    }
     if(L >= R)
        return;
    int mid = (R + L) >> 1;

    if(mid >= L)
        Solution(nod << 1,L,mid,m,M);
    if(mid < R)
        Solution((nod << 1) + 1,mid + 1,R,m,M);

}


int main()
{
    ios :: sync_with_stdio(false);

    int T,x,y;

    A.Read();
    A.BuildArb(1,1,A.N);

    for(int i = 1; i <= A.Q; i++){
        fin >> T >> x >> y;
        if(T == 0){
            A.sol = 0;
            A.Solution(1,1,A.N,x,y);
            fout << A.sol << "\n";
        } else {
            A.Update(1,1,A.N,x,y);
        }

    }


    return 0;
}