Cod sursa(job #760228)

Utilizator bratualexBratu Alexandru bratualex Data 20 iunie 2012 17:30:57
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 2.02 kb
#include <fstream>

using namespace std;
ifstream fin ("arbint.in");
ofstream fout ("arbint.out");
int v[500000];
int n;
//int max ( int, int );
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;
if (n)
{
    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";
        }
    }
    //for ( i=1;i<=4*n-1;i++)
    //    fout<<v[i]<<" ";
    //fout<<" \n";
    //fout<<interogare(1,1,10,3,4);
}
    fin.close();
    fout.close();
    return 0;
}


void actualizare (int poz,int stg,int dr,int a,int b,int x)
{
    //fout<<"functia este apelata pentru "<<poz<<" "<<stg<<" "<<dr<<" "<<a<<" "<<b<<" "<<x<<"\n";
    int mid;
    if (( a<= stg) && (dr<=b))
    {
        //check[poz]=1;
        v[poz]=x;
        return;
    }
   // else
    //{
        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 max ( int a , int b )
{
    if ( a>b )
        return a;
    return b;
}
*/


int interogare (int poz,int stg,int dr,int a,int b)
{
    //fout<<"functia este apelata pentru "<<poz<<" "<<stg<<" "<<dr<<" "<<a<<" "<<b<<" "<<x<<"\n";
    int mid,s=0,d=0;
    if (( a<= stg) && (dr<=b))
    {

        return v[poz];
    }
    //else
    //{
        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;
       // v[poz]=max(v[2*poz],v[2*poz+1]);
    //}
}