Cod sursa(job #1993842)

Utilizator SpiristulTeribilStefan Vilcu SpiristulTeribil Data 23 iunie 2017 20:47:18
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.3 kb
#include <cstdio>
#include <cmath>
#include <algorithm>

using namespace std ;

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

int readInt () {
	bool minus = false;
	int result = 0;
	char ch;
	ch = getchar();
	while (true) {
		if (ch == '-') break;
		if (ch >= '0' && ch <= '9') break;
		ch = getchar();
	}
	if (ch == '-') minus = true; else result = ch-'0';
	while (true) {
		ch = getchar();
		if (ch < '0' || ch > '9') break;
		result = result*10 + (ch - '0');
	}
	if (minus)
		return -result;
	else
		return result;
}

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

int main () {
    freopen ("arbint.in", "r", stdin) ;
    freopen ("arbint.out", "w", stdout) ;
    int n, m ; 
    n = readInt() ;
    m = readInt() ;
    int rad = (int) sqrt ((double) n) ;
    if (n > 30000) 
        rad /= 8; 
    for (int i = 0 ; i < n ; ++ i) {
        v [i] = readInt() ;
        sq [i / rad] = max (sq [i/rad], v[i]) ;
    }
    while (m --) {
        int tip, a, b ;
        tip = readInt() ;
        a = readInt() ;
        b = readInt() ;
        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]) ;
                }
                printf("%d\n", best);
                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' ;
            }
            printf("%d\n", best);
        }
        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 ; 
}