Cod sursa(job #1372874)

Utilizator Vele_GeorgeVele George Vele_George Data 4 martie 2015 15:40:42
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.26 kb
#include <iostream>
#include <fstream>
#define inf (1<<30) // 1*2^30
#define nmax 100010
using namespace std;

int T[4*nmax],sol;

int max(int a, int b)
{
    if (a>b) return a;
             return b;
}

void add(int i,int st, int dr, int p, int val)
{
    if (st==dr) T[i]=val;
    else{

        int mid=(st+dr)/2;
        if (mid+1<=p) add(2*i+1,mid+1,dr,p,val);
                 else add(2*i,st,mid,p,val);

        T[i]=max(T[2*i],T[2*i+1]);
    }
}

void show(int i, int st, int dr, int a, int b)
{
    if (a<=st && dr<=b) sol=max(sol,T[i]);
    else
    {
        int mid=(st+dr)/2;
        if (a<=mid)  show(2*i,st,mid,a,b);
        if(mid+1<=b) show(2*i+1,mid+1,dr,a,b);

    }
}
int main()
{

    for(int i=1; i<=4*nmax;i++)
        T[i]=-inf;


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

    int n,m,a,b,x,act;

    f >> n >> m;
    for(int i=1; i<=n; i++)
    {
        f >> x;
        add(1,1,n,i,x);
    }

    for(int i=1; i<=m; i++)
    {
        f >> act >> a >> b;
        if (act==0)
        {
            sol=-inf;
            show(1,1,n,a,b);
            g << sol << "\n";
        }else{
            add(1,1,n,a,b);
        }
    }


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

    return 0;
}