Cod sursa(job #2065956)

Utilizator RaduhhRadu Flocea Raduhh Data 14 noiembrie 2017 16:10:35
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.91 kb
#include <bits/stdc++.h>
 
using namespace std;
 
int n, m, a[100100], sz, nr, block[1010], cod, x, y;  
 
#define DIM 10000
char buff[DIM];
int poz=0;
 
void citeste(int &numar)
{
     numar = 0;
     //cat timp caracterul din buffer nu e cifra ignor      
     while (buff[poz] < '0' || buff[poz] > '9')     
          //daca am "golit" bufferul atunci il umplu
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;
     //cat timp dau de o cifra recalculez numarul          
     while ('0'<=buff[poz] && buff[poz]<='9')
     {
          numar = numar*10 + buff[poz] - '0';
          if (++poz == DIM) 
               fread(buff,1,DIM,stdin),poz=0;               
     }     
}
 
void build(){
    int st = 1, dr = sz, rs;
    while(dr <= n){
        rs = 0;
        for(int i = st; i <= dr; i++)
            rs = max(rs, a[i]);
        block[++nr] = rs;
        st = dr + 1;
        dr += sz;
    }
}
 
int solve(int st, int dr){
    int p = st, rs = 0, cur;
    while(p % sz != 1 && p <= dr)    
        rs = max(a[p++], rs);
    cur = p / sz + 1;
    while(p + sz - 1 <= dr){
        rs = max(block[cur], rs);
        p += sz;
        cur++;
    }
    while(p <= dr)
        rs = max(a[p++], rs);
    return rs;
}   
 
void update(int x, int y){
    a[x] = y;
    int p = x / sz + ((x % sz) != 0);
    int rs = 0, st = (p - 1) * sz + 1, dr = min(st + sz, n + 1);
    for(int i = st; i < dr; i++)
        rs = max(rs, a[i]);
    block[p] = rs;
}
 
int main(){
    freopen ( "arbint.in" , "r" , stdin);
    freopen ( "arbint.out" , "w" , stdout);
    citeste(n); citeste(m);
    for(int i = 1; i <= n; i++)  
        citeste(a[i]);
    sz = int(sqrt(n));
    build();
    for(int i = 1; i <= m; i++){
        { citeste(cod); citeste(x); citeste(y); }
        if(cod)
            update(x, y);
        else
            cout << solve(x, y) << '\n';
    }
}