Cod sursa(job #760233)

Utilizator bratualexBratu Alexandru bratualex Data 20 iunie 2012 18:00:32
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <fstream>

using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int v[400070];
int n;
void actualizare ( int , int , int , int , int , int);
int interogare ( int , int ,int , int ,int );
int main()
{
    int i,y,m;
    int j,k,l;
    fin>>n>>m;


    for (i=1;i<=n;i++)
    {
        fin>>y;
        actualizare(1,1,n,i,i,y);
    }
    for ( i=0;i<m;i++)
    {
        fin>>j>>k>>l;
        if ( j )
        {
            actualizare(1,1,n,k,k,l);
        }
        else
        {
            fout<<interogare(1,1,n,k,l)<<"\n";
        }
    }

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


void actualizare (int poz,int stg,int dr,int a,int b,int x)
{
    int mid;
    if (( a<= stg) && (dr<=b))
    {
        v[poz]=x;
        return;
    }
        mid=(stg+dr)/2;
        if ( a<=mid )
            actualizare (2*poz,stg,mid,a,b,x);
        if ( mid<b )
            actualizare (2*poz+1,mid+1,dr,a,b,x);
        if (v[2*poz]>v[2*poz+1] )
            v[poz]=v[2*poz];
        else
            v[poz]=v[2*poz+1];
 }

int interogare (int poz,int stg,int dr,int a,int b)
{
    int mid,s=0,d=0;
    if (( a<= stg) && (dr<=b))
    {
        return v[poz];
    }
        mid=(stg+dr)/2;
        if ( a<=mid )
            s=interogare (2*poz,stg,mid,a,b);
        if ( mid<b )
            d=interogare (2*poz+1,mid+1,dr,a,b);
        if ( s>d )
        return s;
        else
        return d;
}