Cod sursa(job #1786407)

Utilizator d0rina2011Craciun Dorina d0rina2011 Data 22 octombrie 2016 21:57:02
Problema Arbori de intervale Scor 10
Compilator cpp Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <cstdio>
#include <fstream>
#include <math.h>

using namespace std;

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

int n, m, v[100001], maxim[1000];

int main()
{
    int i, j, rad, op, a, b, M, xx, nr_g;
    float x, y;
    fin >> n >> m;
    rad = (int)sqrt(n);
    if((int)sqrt(n) != sqrt(n)) nr_g = rad + 1;
    else nr_g = rad;
    for (i = 1; i <= n; ++i){
        fin >> v[i];
    }
    for (i = 1; i<= nr_g; ++i){
        maxim[i] = v[rad * (i - 1)+1];
        for (j = rad * (i - 1) + 1; j <= rad * i && j <= n; ++j){
            if (v[j] > maxim[i]) maxim[i] = v[j];
        }
    }
    for (i = 1; i <= m; ++i){
        fin >> op >> a >> b;
        if (op == 0){
            if (a == b) M = v[a];
            else {
                x = (float)a/rad;
                y = (float)b/rad;
                M = -1;
                if ((int)x != x){
                    xx = (int)x + 1;
                }
                else xx = (int)x;
                for (j = xx * rad + 1; j <= (int)y * rad; ++j)
                    if (maxim[j] > M) M = maxim[j];
                for (j = a; j <= (int)y * rad; ++j)
                    if (v[j] > M) M = v[j];
                for (j = (int)y * rad + 1; j <= b; ++j)
                    if(v[j] > M) M = v[j];
            }
            fout << M <<"\n";
        }
        else{
            x = (float)a/rad;
            if ((int)x != x){
                xx = (int)x + 1;
            }
            else xx = (int)x;
            if (v[a] == maxim[xx])
            {
                maxim[xx] = -1;
                for (j = rad * (xx - 1) + 1; j <= rad * xx && j <= nr_g; ++j)
                    if (v[j] > maxim[xx] && j != a)maxim[xx] = v[j];
            }
            v[a] = b;
            if (v[a] > maxim[xx]) maxim[xx] = v[a];
        }
    }
    return 0;
}