Cod sursa(job #2003405)

Utilizator LucaSeriSeritan Luca LucaSeri Data 22 iulie 2017 20:40:56
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <cmath>
using namespace std;

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

const int MAXN = 100000;

int v[MAXN + 1000];
int maxime[405];

void update(int n, int v[MAXN + 1000], int maxime[405], int a, int rad){
    int i = a/rad;
    maxime[i] = -1;
    for(int k = rad*i; k < rad*(i+1); ++k){
        if(v[k] > maxime[i]) maxime[i] = v[k];
    }
}

void query(int n, int v[MAXN + 1000], int maxime[405], int a, int b, int rad){
    int left = a/rad;
    int right = b/rad;
    int best = -1;
    for(int i = left + 1; i < right; ++i){
        best = max(best, maxime[i]);
    }

    for(int i = a; i < rad *(left+1) && i <= b; ++i){
        best = max(best, v[i]);
    }

    for(int i = max(rad*right, a); i <= b; i++){
        best = max(best, v[i]);
    }

    g << best << "\n";
}


int main()
{
    int n, m;
    f >> n >> m;

    int rad = sqrt(n);

    for(int i = 0; i < n; ++i){
        f >> v[i];
        if(v[i] > maxime[i/rad]){
            maxime[i/rad] = v[i];
        }
    }

    for(int type, a, b; m; --m){
        f >> type >> a >> b;
        if(type){
            v[a-1] = b;
            update(n, v, maxime, a-1, rad);
        }
        else{
            query(n, v, maxime, a-1, b-1, rad);
        }
    }
    return 0;
}