Cod sursa(job #1386294)

Utilizator rogoz.bogdanRogoz Bogdan rogoz.bogdan Data 12 martie 2015 21:05:02
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.38 kb
#include <fstream>
#define MX 100001
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");
int n,m;
int a[MX * 3], p1, p2; //p1=poz, p2=nr sau p1=extrema stanga, p2=extr dreapta

void actualizare(int nod, int st, int dr)
{
    if(st == dr)
    {
        a[nod] = p2;
        return;
    }

    int mij = (st + dr) >> 1;
    if(p1 <= mij)
    {
        actualizare(nod<<1, st, mij);
    }
    else
    {
        actualizare((nod<<1)+1, mij+1, dr);
    }

    a[nod] = max(a[nod<<1], a[(nod<<1)+1]);
}

int cautare(int nod, int st, int dr)
{
    if(p1<=st && dr<=p2)
    {
        return a[nod];
    }

    int mij = (st + dr) >> 1;
    int mst, mdr;
    mst = mdr = 0;

    if(p1 <= mij)
    {
        mst = cautare(nod<<1, st, mij);
    }
    if(mij+1 <= p2)
    {
        mdr = cautare((nod<<1)+1, mij+1, dr);
    }

    return max(mst, mdr);
}

int main()
{
    int i,x,y,tip;
    fin>>n>>m;

    for(i=1; i<=n; i++)
    {
        fin>>x;
        p1 = i;
        p2 = x;
        actualizare(1, 1, n);
    }

    for(i=1; i<=m; i++)
    {
        fin>>tip>>x>>y;
        p1 = x;
        p2 = y;
        if(tip == 0)
        {
            fout<<cautare(1, 1, n)<<'\n';
        }
        else
        {
            actualizare(1, 1, n);
        }
    }

    fin.close(); fout.close();
    return 0;
}