Cod sursa(job #2002846)

Utilizator LucaSeriSeritan Luca LucaSeri Data 20 iulie 2017 22:45:42
Problema Arbori de intervale Scor 0
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[105];

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

void query(int n, int v[MAXN + 1000], int maxime[105], int a, int b, int rad){
    int left = (a-1)/rad;
    int right = (b-1)/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){
        best = max(best, v[i]);
    }

    for(int i = rad*right+1; 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 = 1; i <= n; ++i){
        f >> v[i];
        if(v[i] > maxime[(i - 1) / rad]){
            maxime[(i - 1) / rad] = v[i];
        }
    }

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