Cod sursa(job #2815601)

Utilizator DajaMihaiDaja Mihai DajaMihai Data 9 decembrie 2021 21:40:30
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.74 kb
#include <bits/stdc++.h>

#define MAXX 1000

using namespace std;

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

const int square = sqrt (MAXX);

int v[MAXX];
int n, m, i;

int batog[34]; // nu imi mergea declararea cu const int


void build (int l){
    int j;
    for (j = 0; j < n; j ++){
        in >> v[j];
    }

    for (j = 0; j < n; j ++){
        batog[j / square] = max(batog[j / square], v[j]);
    }
}


void update (int a, int b){
    if (v[a] != batog[a / square]){
        v[a] = b;
        batog[a / square] = max(batog[a / square], b);
    }
    else {
        int first_spot = (a / square) * square;
        int last_spot =(a / square) * square + square;
        int j;

        v[a] = b;
        batog[first_spot / square] = -1;

        for (j = first_spot; j < last_spot; j ++){
            batog[j / square] = max (batog[j / square], v[j]);
        }
    }
}


int query (int a, int b){
    int first_Int = min ((a / square) * square + square, b);
    int last_Int = max ((b / square) * square, a);
    int j, maxxi = -1;

    for (j = a; j < first_Int; j ++) //stanga
        maxxi = max (maxxi, v[j]);

    for (j = last_Int + 1; j <= b; j ++) //dreapta
        maxxi = max (maxxi, v[j]);

    for (j = first_Int / square; j < (last_Int + 1) / square; j ++) // mijl
        maxxi = max (maxxi, batog[j]);
    out << maxxi << '\n';
}

int main()
{
    in >> n >> m;

    build (n);

    int op, a, b;

    for (i = 0; i < m; i ++){
        in >> op;

        if (op == 1){
            in >> a >> b;
            update (a - 1, b);
        }
        else if (op == 0){
            in >> a >> b;
            query (a - 1, b - 1);
        }
    }

    return 0;
}