Cod sursa(job #1515653)

Utilizator alex.craciunCraciun Alexandru alex.craciun Data 1 noiembrie 2015 23:13:00
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.08 kb
#include <iostream>
#include <climits>
#include <fstream>
using namespace std;

int arb[100010],a[300010];

void build_arb_i(int i,int li,int lf)
{
    if(li==lf)
    {
        arb[i]=a[li];
        return;
    }
    int m=(li+lf)/2;
    build_arb_i(2*i,li,m);
    build_arb_i(2*i+1,m+1,lf);
    arb[i]=max(arb[2*i],arb[2*i+1]);
}

int maxim(int a,int b,int i,int li,int lf)
{
    if(a<=li&&lf<=b)return arb[i];
    int m=(li+lf)/2,v,mx=INT_MIN;
    if(a<=m)
    {
        v=maxim(a,b,2*i,li,m);
        if(v>mx)mx=v;
    }
    if(b>=m+1)
    {
        v=maxim(a,b,2*i+1,m+1,lf);
        if(v>mx)mx=v;
    }
    return mx;
}

int main()
{
    int n,i,c,a1,b,m;
    ifstream fin("arbint.in");
    fin>>n>>m;
    for(i=1;i<=4*n;i++)arb[i]=-1;
    for(i=1;i<=n;i++)
        fin>>a[i];
    ofstream fout ("arbint.out");
    build_arb_i(1,1,n);
     for(i=1;i<=m;i++)
     {fin>>c>>a1>>b;
       if(c==0)
          fout<<maxim(a1,b,1,1,n)<<"\n";
       else
       {
           a[a1]=b;
           build_arb_i(1,1,n);
       }
     }

    return 0;
}