Cod sursa(job #829251)

Utilizator cristi_berceanuFMI - Cristi Berceanu cristi_berceanu Data 4 decembrie 2012 23:08:05
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <fstream>
 
using namespace std;
 
ifstream f("arbint.in");
ofstream g("arbint.out");
 
int n, m, v[262145], maxim;
 
int max(int a, int b)
{
    if(a>b)
        return a;
    return b;
}
 
void adaugare(int k, int st, int dr, int poz, int val)
{
    if (st == dr)
    {
        v[k] = val;
        return;
    }
     
    int m = (st+dr)/2, fs = k*2;
     
    if (poz <= m) 
        adaugare(fs, st, m, poz, val);
    else
        adaugare(fs+1, m+1, dr, poz, val);
     
    v[k] = max(v[fs], v[fs+1]);
}
 
void cautare(int k, int st, int dr, int inc, int sf)
{
    if (inc <= st && dr <= sf)
    {
        if (maxim < v[k]) 
            maxim = v[k];
        return;
    }
     
    int m = (st+dr)/2, fs = k*2;
    if (inc <= m) 
        cautare(fs, st, m, inc, sf);
    if (m < sf) 
        cautare(fs+1, m+1, dr, inc, sf);
}
 
int main()
{
    int a, b, c, i;
     
    f>>n>>m;
     
    for (i=1;i<=n;++i)
    {
        f>>c;
        adaugare(1, 1, n, i, c);
    }
     
    for (i=1;i<=m;++i)
    {
        f>>c>>a>>b;
        if (c)
            adaugare(1, 1, n, a, b);
        else
        {
            maxim = 0;
            cautare(1, 1, n, a, b);
            g<<maxim<<"\n";
        }
    }
    return 0;
}