Cod sursa(job #1472532)

Utilizator dorumusuroiFMI - Doru Musuroi dorumusuroi Data 17 august 2015 12:13:25
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.99 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);
FILE *out;
int A[MAXN],n,m,sqrtn, sn;
int B[SMAXN];
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);
}
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];
    }
}
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;
//    printf("st = %d ed = %d\n", st, ed);
    for(int i = st; i < ed; i++)
        if(B[i] > maxim) maxim = B[i];
    ed*= sqrtn;
    for(; ed <= end && ed >= start; ++ed)
        if(A[ed] > maxim) maxim = A[ed];
    return maxim;
}
void update(int 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];
}
void solve(){
    int c,a,b;
    for(int i = 0; i < m; ++i){
        scanf("%d %d %d", &c, &a, &b);
        if(c == 0) fprintf(out,"%d\n", getMax(a-1,b-1));
        if(c == 1){
            A[a-1] = b;
            update(a-1);
//            for(int i = 0; i < n; ++i)
//                printf("%d ", A[i]);
//            printf("\n");
//            for(int i = 0; i < sn; ++i)
//                printf("%d ", B[i]);
//            printf("\n");
        }
    }
}
int main()
{
    freopen(iname, "r", stdin);
//    freopen(oname, "w",stdout);
    out = fopen(oname, "w");
    read();
    initializeB();
    solve();
    return 0;
}