Cod sursa(job #1993831)

Utilizator SpiristulTeribilStefan Vilcu SpiristulTeribil Data 23 iunie 2017 20:36:25
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.81 kb
#include <fstream>
#include <cmath>

using namespace std ;

ifstream cin ("arbint.in") ;
ofstream cout ("arbint.out") ;

const int MAX = 1e5 + 14 ;
const int SQ = 1300 ; 

int v [MAX] ;
int sq [SQ] ;

int main () {
    int n, m ; 
    cin >> n >> m ; 
    int rad = (int) sqrt ((double) n) ;
    //if (n > 30000) 
    //    rad >>= 1; 
    for (int i = 0 ; i < n ; ++ i) {
        cin >> v [i] ;
        sq [i / rad] = max (sq [i/rad], v[i]) ;
    }
    while (m --) {
        int tip, a, b ;
        cin >> tip >> a >> b ; 
        if (tip == 0) {
            a -= 1 ;
            b -= 1 ;
            int best = 0 ; 
            int st = a / rad ;
            int dr = b / rad ;
            for (int i = st + 1 ; i < dr ; ++ i) {
                best = max (best, sq [i]) ;
                //cout << "a intrat pe bucata " << i << '\n' ;
            }
            if (st == dr) {
                for (int i = a ; i <= b ; ++ i) {
                    best = max (best, v[i]) ;
                }
                cout << best << '\n' ;
                continue ; 
            }
            for (int i = a ; i / rad == st ; ++ i) {
                best = max (best, v [i]) ;
                //cout << "a intrat pe pozitia " << i << '\n' ; 
            }
            for (int i = b ; i / rad == dr ; -- i) {
                best = max (best, v [i]) ;
                //cout << "a intrat pe pozitia " << i << '\n' ;
            }
            cout << best << '\n' ;
        }
        else {
            a -= 1 ;
            v [a] = b ;
            int st = a / rad ;
            st += 1 ;
            sq [st - 1] = 0 ;
            for (int i = a - a % rad ; ; ++ i) {
                if (i / rad == st) {
                    break ;
                }
                sq [i / rad] = max (sq [i / rad], v [i]) ;
            }
        }
    }
    return 0 ; 
}