Cod sursa(job #2015830)

Utilizator mihaicivMihai Vlad mihaiciv Data 27 august 2017 18:23:58
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 2.35 kb
#include <iostream>
#include <fstream>
#define nmax 400001
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
bool da;
int a[nmax],val,maxim,m1,n,a1,b,poz;

void actualizare(int nod,int st,int dr)
{
    int m;
    if (st==dr){
        //da=false;
        a[nod]=val;
        return;
    }
    m=(st+dr)/2;
    if (poz<=m){
        actualizare(2*nod,st,m);
    }else{
        actualizare(2*nod+1,m+1,dr);

    }
    a[nod]=max(a[2*nod],a[2*nod+1]);
}

/*
void actualizare(int nod,int st,int dr)
{
    int mij;
    if(st==dr)
    {
        a[nod]=val;
        return;
    }
    mij=(st+dr)/2;
    if(poz<=mij)
    {
        actualizare(2*nod,st,mij);
    }
    else
    {
        actualizare(2*nod+1,mij+1,dr);
    }
    a[nod]=max(a[2*nod],a[2*nod+1]);
}
*/
void cautare(int nod,int st,int dr)
{
    int m;
    if (a1<=st && dr<=b)
    {
        if (a[nod]>maxim)
        {
            maxim=a[nod];
        }
        //maxim=max(maxim,a[nod]);
        return;
    }
    m=(st+dr)/2;
    if (a1<=m)
    {
        cautare(2*nod,st,m);
    }
    if (b>m)
    {
        cautare(2*nod+1,m+1,dr);
    }
}

void citire()
{
    /*
    int x,y;
    f>>n>>m1;
    for (int i=1;i<=n;i++)
    {
        f>>x;
        val=x;
        poz=i;
        //maxim=0;
        da=true;
        actualizare(1,1,n);
    }
    //cout<<a[4];
    int op;
    for (int i=1;i<=m1;i++)
    {
        f>>op>>x>>y;
        if (op){
            val=y;
            poz=x;
            actualizare(1,1,n);
        }else{
            maxim=-1;
            a1=x;
            b=y;
            //cout<<a1<<" "<<b<<"\n";
            cautare(1,1,n);
            g<<maxim<<"\n";
        }
        cout<<a[2]<<"\n";
    }
    */
    //int x,a,b,i,op;
    f>>n>>m1;
    int x;
    for(int i=1;i<=n;i++)
    {
        f>>x;
        poz=i;
        val=x;
        actualizare(1,1,n);
    }
    int y,op;
    for(int i=1;i<=m1;i++)
    {
        f>>op>>x>>y;
        if(op==0)
        {
            maxim=-1;
            a1=x;
            b=y;
            cautare(1,1,n);
            g<<maxim<<"\n";
        }
        else
        {
            poz=x;
            val=y;
            actualizare(1,1,n);
        }
    }
}
void rez()
{

}
int main()
{
    citire();
    //rez();
    return 0;
}