Cod sursa(job #1786074)

Utilizator Moise_AndreiMoise Andrei Moise_Andrei Data 22 octombrie 2016 12:43:19
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <fstream>
#include <cmath>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
const int nMax = 100005;
int v[nMax], bucata[400];
int n, m;
int lungime;
void Construire()
{
    lungime = sqrt(n);
    for(int i = 0; i < n; i ++)
    {
        int index = i / lungime;
        bucata[index] = max(bucata[index], v[i]);
    }
}

int Query(int st, int dr)
{
    int pasi = dr % lungime + 1;
    int sol = 0;
    /// calculam maximul din bucata ramasa in dreapta
    for(int i = 0; i < pasi; i ++)
    {
        sol = max(sol, v[dr]);
        dr --;
    }
    pasi = lungime - (st % lungime);
    for(int i = 0; i < pasi; i ++)
    {
        sol = max(sol, v[st]);
        st ++;
    }
    int start = (st / lungime);
    int stop  = (dr / lungime);
    for(int i = start; i <= stop; i ++)
        sol = max(sol, v[i]);
    return sol;
}

void Update(int poz, int val)
{
    int index = poz / lungime;
    bucata[index] = 0;
    int start = poz - (poz % lungime);
    int stop = min(n, start + lungime - 1);
    v[poz] = val;
    for(int i = start; i <= stop; i ++)
        bucata[index] = max(bucata[index], v[i]);
}
int main()
{
    in >> n >> m;
    for(int i = 0; i < n; i ++)
        in >> v[i];
    Construire();
    for(int i = 1; i <= m; i ++)
    {
        bool op;
        in >> op;
        if(op == 0)
        {
            int st, dr;
            in >> st >> dr;
            st --, dr --;
            int sol = Query(st, dr);
            out << sol << "\n";
        }
        else
        {
            int poz, valoare;
            in >> poz >> valoare;
            poz --;
            Update(poz, valoare);
        }
    }
    return 0;
}