Cod sursa(job #1472566)

Utilizator dorumusuroiFMI - Doru Musuroi dorumusuroi Data 17 august 2015 12:51:46
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.62 kb
#include <cstdio>
#include <cmath>
using namespace std;
const char iname[] = "arbint.in";
const char oname[] = "arbint.out";
const int MAXN = 100005;
const int SMAXN = sqrt(MAXN);
int A[MAXN],n,m,sqrtn, sn;
int B[SMAXN];
//inline void read(){
//    scanf("%d %d\n", &n, &m);
//    sqrtn = sqrt(n);
//    if(sqrt(n) * sqrt(n) == n)
//        sn = sqrtn + 1;
//    else
//        sn = sqrt(n) + 1;
//    for(int i = 0; i < n; ++i)
//        scanf("%d", A+i);
//}
//inline void initializeB(){
//    for(int index = 0; index < sn; ++index){
//        int start = index * sqrtn;
//        int end = (index + 1) * sqrtn;
//        for(int i = start; i < end && i < n; ++i)
//            if(A[i] > B[index]) B[index] = A[i];
//    }
//}
inline int getMax(int start, int end){
    int maxim = 0;
    for(; start%sqrtn != 0 && start <= end; ++start)
        if(A[start] > maxim) maxim = A[start];
    int st = start/sqrtn;
    int ed = end/sqrtn;
    for(int i = st; i < ed; i++)
        if(B[i] > maxim) maxim = B[i];
    ed = ed * sqrtn;
    for(; ed <= end && ed >= start; ++ed)
        if(A[ed] > maxim) maxim = A[ed];
    return maxim;
}
//inline void update(int poz){
//    poz = poz / sqrtn;
//    B[poz] = 0;
//    int start = sqrtn * poz;
//    int end = sqrtn * (poz + 1);
//    for(int i = start; i < end && i < n; ++i)
//        if(A[i] > B[poz]) B[poz] = A[i];
//}
//inline void solve(){
//    int c,a,b;
//    for(register int i = 0; i < m; ++i){
//        scanf("%d %d %d", &c, &a, &b);
//        if(c == 0) printf("%d\n", getMax(a-1,b-1));
//        if(c == 1){
//            A[a-1] = b;
//            update(a-1);
//        }
//    }
//}
int main()
{
    freopen(iname, "r", stdin);
    freopen(oname, "w",stdout);
    scanf("%d %d\n", &n, &m);
    sqrtn = sqrt(n);
    if(sqrt(n) * sqrt(n) == n)
        sn = sqrtn + 1;
    else
        sn = sqrt(n) + 1;
    for(int i = 0; i < n; ++i)
        scanf("%d", A+i);
    for(int index = 0; index < sn; ++index){
        int start = index * sqrtn;
        int end = (index + 1) * sqrtn;
        for(int i = start; i < end && i < n; ++i)
            if(A[i] > B[index]) B[index] = A[i];
    }
    int c,a,b;
    for(register int i = 0; i < m; ++i){
        scanf("%d %d %d", &c, &a, &b);
        if(c == 0) printf("%d\n", getMax(a-1,b-1));
        if(c == 1){
            A[a-1] = b;
            int poz = a-1;
            poz = poz / sqrtn;
    B[poz] = 0;
    int start = sqrtn * poz;
    int end = sqrtn * (poz + 1);
    for(int i = start; i < end && i < n; ++i)
        if(A[i] > B[poz]) B[poz] = A[i];
        }
    }
    return 0;
}