Cod sursa(job #689729)

Utilizator GaborGabrielFMI - GabrielG GaborGabriel Data 24 februarie 2012 19:31:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <fstream>
#include <stdio.h>
#define maxim(a,b) ((a>b)?a:b)
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

long long n,m,A[350009],to,a,b,i;

void update(int nod,int stanga,int dreapta,int poz,int val)
{
    if(stanga==dreapta)
        A[nod]=val;
    else
    {
        int mij=(stanga+dreapta)/2;
        if(poz<=mij)
            update(2*nod,stanga,mij,poz,val);
        else
            update(2*nod+1,mij+1,dreapta,poz,val);
        A[nod]=maxim(A[2*nod],A[2*nod+1]);
    }
}

int querry(int nod,int stanga,int dreapta,int a,int b)
{
    if(a<=stanga && dreapta<=b)
        return A[nod];
    int mij=(stanga+dreapta)/2,i1=0,i2=0;

    if(a<=mij) i1=querry(2*nod,stanga,mij,a,b);
    if(b>mij) i2=querry(2*nod+1,mij+1,dreapta,a,b);
    return maxim(i1,i2);
}

int main()
{
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>a;
        update(1,1,n,i,a);
    }
    for(i=1;i<=m;i++)
    {
        f>>to>>a>>b;
        if(!to)
        {
            g<<querry(1,1,n,a,b)<<'\n';
        }
        else
            update(1,1,n,a,b);
    }
    f.close();
    g.close();
    return 0;
}