Cod sursa(job #1758602)

Utilizator ducu34Albastroiu Radu Gabriel ducu34 Data 17 septembrie 2016 15:29:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.86 kb
//
//  main.cpp
//  ArboriDeIntervale
//
//  Created by Albastroiu Radu on 9/17/16.
//  Copyright © 2016 Albastroiu Radu. All rights reserved.
//

#include <iostream>
#include <fstream>
#include <algorithm>
#include <unordered_map>
#include <vector>
#define MULTFOARTEMULT (1<<28)-1
using namespace std;

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

int i, j, n, m, tip, a, b, v[100001], arb[200001], Max;

void populateArb(int left, int right, int p)
{
    if(left == right)
    {
        arb[p] = v[left];
    }
    else
    {
        int mij = (left+right)/2;
        
        populateArb(left, mij, p*2);
        populateArb(mij+1, right, p*2+1);
        
        arb[p] = max( arb[p*2], arb[p*2+1] );
    }
}

void update(int left, int right, int a, int b, int p)
{
    if(left == right)
    {
        arb[p] = b;
    }
    else
    {
        int mij = (left+right)/2;
        
        if( a <= mij && a >= left  )
            update(left, mij, a, b, p*2);
        if( a >  mij && a <= right )
            update(mij+1, right, a, b, p*2+1);
        
        arb[p] = max( arb[p*2], arb[p*2+1] );
    }
}

void querry(int left, int right, int a, int b, int p)
{
    if( left >= a && right <= b )
    {
        Max = max(arb[p], Max);
    }
    else
    {
        int mij = (left+right)/2;
        
        if( mij   >= a )
            querry(left,  mij,   a, b, p*2  );
        
        if( mij+1 <= b )
            querry(mij+1, right, a, b, p*2+1);
    }
}

int main()
{
    fin>>n>>m;
    
    for(i=1;i<=n;i++)
        fin>>v[i];
    
    populateArb(1, n, 1);
    
    for(i=1;i<=m;i++)
    {
        fin>>tip>>a>>b;
        
        if(tip)
            update(1,n,a,b,1);
        
        else
        {
            Max = 0;
            if(a>b)
                swap(a,b);
            
            querry(1,n,a,b,1);
            fout << Max << "\n";
        }
    }
    return 0;
}