Cod sursa(job #1212582)

Utilizator fromzerotoheroFROM ZERO fromzerotohero Data 25 iulie 2014 11:38:48
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <cmath>
using namespace std;

#define nmax 100001
ifstream in("arbint.in");
ofstream out("arbint.out");

int n,m,i,j,MAX,a,b,k;
bool tip;
int A[nmax],SQ[nmax];

void citire() {
    in >> n >> m;
    
    k = sqrt(n) + 1;
    
    for (i=1; i<=n; i++){
        in >> A[i];
        
        if (i%k == 0)
            SQ[++j] = MAX,
            MAX = 0;
        else
            MAX = max(MAX, A[i]);
        
    }
}

void update(int i, int val) {
    
    SQ[(i-1)/k + 1] = max(SQ[(i-1)/k + 1], val);
    
    A[i] = val;
    
}

int value(int st, int dr) {
    
    int Max = -1;
    int lo = (st-1)/k + 1;
    int hi = (dr-1)/k + 1;
    
    for (int i=st; i<=lo*k; i++)
        Max = max(Max, A[i]);
    
    for (int i=lo+1; i<=hi-1; i++)
        Max = max(Max, SQ[i]);
    
    for (int i=(hi-1)*k+1; i<=dr; i++)
        Max = max(Max, A[i]);
    
    return Max;
}

void rezolvare() {
    
    for (i=1; i<=m; i++) {
        
        in >> tip;
        
        if (!tip) {
            
            in >> a >> b;
            
            out << value(a, b) << "\n";
            
        } else {
            
            in >> a >> b;
            
            update(a, b);
       
        }
        
    }
    
}

int main() {
    
    citire();
    rezolvare();
    
    return 0;
}