Cod sursa(job #3251447)

Utilizator Sasha_12454Eric Paturan Sasha_12454 Data 26 octombrie 2024 07:59:33
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.79 kb
//sqrt
#include <bits/stdc++.h>

const std :: string FILENAME = "arbint";

std :: ifstream f (FILENAME + ".in");

std :: ofstream g (FILENAME + ".out");

const int NMAX = 1e5 + 5;

const int l = 320;

int n;

int q;

int cer;

int x;

int y;

int maxi;

int v[NMAX];

int b[l + 5];

int main()
{

    f >> n >> q;

    for(int i = 0; i < n; i ++)
    {
        f >> v[i];

        b[i / l] = std :: max(b[i / l], v[i]);
    }

    while(q --)
    {
        f >> cer;

        if(cer == 0)
        {
            maxi = -1;

            f >> x >> y;

            x --;

            y --;

            if(x > y)
            {
                std :: swap(x, y);
            }

            if(x / l == y / l)
            {
                for(int i = x; i <= y; i ++)
                {
                    maxi = std :: max(maxi, v[i]);
                }

                g << maxi << '\n';
            }
            else
            {
                for(int i = x; i < (x / l + 1) * l; i ++)
                {
                    maxi = std :: max(maxi, v[i]);
                }

                for(int i = x / l + 1; i < y / l; i ++)
                {
                    maxi = std :: max(maxi, b[i]);
                }

                for(int i = (y / l) * l; i <= y; i ++)
                {
                    maxi = std :: max(maxi, v[i]);
                }

                g << maxi << '\n';
            }
        }
        else
        {
            f >> x >> y;

            x --;

            v[x] = y;

            b[x / l] = -1;

            for(int i = (x / l) * l; i < (x / l + 1) * l; i ++)
            {
                b[x / l] = std :: max(b[x / l], v[i]);
            }
        }
    }

    return 0;
}