Cod sursa(job #1379082)

Utilizator ArmandNMArmand Nicolicioiu ArmandNM Data 6 martie 2015 16:12:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <algorithm>

const int NMAX = 100005;

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

int N,M,val,pos,maxim,x,y,type;
int ArbMax[NMAX<<2];

void Query(int nod, int left, int right)
{
    if (x <= left && right <= y)
    {
        maxim = max(ArbMax[nod],maxim);
        return;
    }

    int mid = (left+right)/2;

    if (y > mid)
        Query(nod*2+1,mid+1,right);
    if (x <= mid)
        Query(nod*2,left,mid);
}

void Update(int nod, int left, int right)
{
    if (left == right)
    {
        ArbMax[nod] = val;
        return;
    }

    int mid = (left + right) / 2;

    if (pos <= mid)
        Update(nod*2,left,mid);
    if (pos > mid)
        Update(nod*2+1,mid+1,right);

    ArbMax[nod] = max(ArbMax[nod*2],ArbMax[nod*2+1]);
}

int main()
{
    f >> N >> M;
    for (int i = 1; i <= N; ++i)
    {
        f >> val;
        pos = i;
        Update(1,1,N);
    }

    while(M--)
    {
        f >> type;
        if (type == 0)
        {
            f >> x >> y;
            maxim = 0;
            Query(1,1,N);
            g << maxim << '\n';
        }
        if (type == 1)
        {
            f >> pos >> val;
            Update(1,1,N);
        }
    }

    f.close();
    g.close();

    return 0;
}