Cod sursa(job #1785808)

Utilizator SlevySlevoaca Stefan-Gabriel Slevy Data 21 octombrie 2016 23:19:07
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <fstream>
#include <cmath>
#include <algorithm>
#define NMAX 100001
#define SMAX 317

using namespace std;

ifstream in("arbint.in");
ofstream out("arbint.out");
int A[NMAX], mn[SMAX], poz[NMAX];
int dx[SMAX], dy[SMAX];
int n, m;

void Update(int a, int b, int length)
{
    A[a] = b;
    int piece = (a - 1) / length;
    mn[piece] = -1;
    for (int i = dx[piece]; i <= dy[piece]; i++)
        mn[piece] = max(mn[piece],A[i]);
}

int Query(int a, int b)
{
    int pA = poz[a], pB = poz[b];
    int maxx = -1;
    if (pA != pB)
    {
        for (int i = a; i <= dy[pA]; i++)
            maxx = max(maxx, A[i]);
        for (int i = dx[pB]; i <= b; i++)
            maxx = max(maxx, A[i]);
    }
    else
        for (int i = a; i <= b; i++)
             maxx = max(maxx, A[i]);
    for (int i = pA + 1; i < pB; i++)
          maxx = max(maxx, mn[i]);
    return maxx;
}

int main()
{
    in >> n >> m;
    for (int i = 1; i <= n; i++)
        in >> A[i];
    int length = sqrt(n);
    int L = n / length;
    if((double) L < (1.0 * n) / length)
        L++;
    for (int i = 0; i < L; i++)
    {
        mn[i] = -1;
        dx[i] = i * length + 1;
        dy[i] = dx[i] + length - 1;
    }
    dy[L - 1] = n;
    int buc;
    for (int i = 1; i <= n; i++)
    {
        buc = (i-1) / length;
        mn[buc] = max(mn[buc],A[i]);
        poz[i] = buc;
    }
    int x, y, z;
    for (int i = 1; i <= m; i++)
    {
        in >> x >> y >> z;
        if (x == 0)
            out << Query(y,z) << "\n";
        else
            Update(y,z,length);
    }
    return 0;
}