Cod sursa(job #2018764)

Utilizator tziplea_stefanTiplea Stefan tziplea_stefan Data 5 septembrie 2017 21:58:01
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.48 kb
#include <fstream>
#include <cmath>
#define DIM 355
#define VAL 100005

using namespace std;

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

struct bucket
{
    int nr, be, en;
};

bucket B[DIM];

int N, M, K, i, j, rad;
int v[VAL], op, a, b;

void Update(int a, int b)
{
    int i, j;
    v[a]=b;
    for (i=1; i<=K; i++)
      if (B[i].be<=a && a<=B[i].en)
        break;
    B[i].nr=0;
    for (j=B[i].be; j<=B[i].en; j++)
      B[i].nr=max(B[i].nr, v[j]);
}

int GetAnswer(int a, int b)
{
    int i, j;
    int ANS=0;
    for (i=1; i<=K; i++)
    {
        if (a<=B[i].be && B[i].en<=b)
          ANS=max(ANS, B[i].nr);
        else
        {
            if (B[i].be<=a && a<=B[i].en)
            {
                for (j=a; j<=B[i].en; j++)
                  ANS=max(ANS, v[j]);
            }
            else
            {
                if (B[i].be<=b && b<=B[i].en)
                  for (j=B[i].be; j<=b; j++)
                    ANS=max(ANS, v[j]);
            }
        }
    }
    return ANS;
}

int main()
{
    fin >> N >> M;
    rad=sqrt(N);
    for (i=1; i<=N; i++)
      fin >> v[i];
    i=1;
    while (i<=N)
    {
        B[++K].be=i;
        B[K].en=min(i+rad-1, N);
        for (j=B[K].be; j<=B[K].en; j++)
          B[K].nr=max(B[K].nr, v[j]);
        i+=rad;
    }
    for (i=1; i<=M; i++)
    {
        fin >> op >> a >> b;
        if (op==0)
          fout << GetAnswer(a, b) << '\n';
        else
          Update(a, b);
    }
    fin.close();
    fout.close();
    return 0;
}