Cod sursa(job #2626391)

Utilizator mihaimbMihai Badea mihaimb Data 6 iunie 2020 14:09:13
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>



using namespace std;



int V[100000], A[400004];


void cons(int p, int l, int r)
{

    if(l<0) return;

    if(l==r)

    {

        A[p]=l;

    }



    else

    {

        cons(2*p, l, (l+r)/2);

        cons(2*p+1, (l+r)/2+1, r);



        if(V[A[2*p]]>V[A[2*p+1]])

        {

            A[p]=A[2*p];

        }

        else

        {

            A[p]=A[2*p+1];

        }

    }

}

void upd(int p, int l, int r, int ind)
{

    if(ind<l || ind>r) return;

    if(l==r)

    {

        A[p]=l;

    }



    else

    {

        upd(2*p, l, (l+r)/2, ind);

        upd(2*p+1, (l+r)/2+1, r, ind);



        if(V[A[2*p]]>V[A[2*p+1]])

        {

            A[p]=A[2*p];

        }

        else

        {

            A[p]=A[2*p+1];

        }

    }

}


int rez(int p, int l, int r, int a, int b)

{

    if(a>r || b<l || l>r) return -1;



    if(l>=a && r<=b) return A[p];



    int k=rez(2*p, l, (l+r)/2,a,b), j=rez(2*p+1, (l+r)/2+1,r,a,b);



    if(k==-1)

    {

        return j;

    }

    if(j==-1)

    {

        return k;

    }



    if(V[j]>V[k])

    {

        return j;

    }



    return k;

}



int main()

{

    ifstream fin("arbint.in");

    ofstream fout("arbint.out");



    int n,m,op,t1, t2;



    fin>>n>>m;



    for(int i=0; i<n; i++)

    {

        fin>>V[i];

    }



    cons(1,0,n-1);



    for(int i=0; i<m; i++)

    {

        fin>>op>>t1>>t2;



        if(op==0)

        {

            t1--;

            t2--;

            fout<<V[rez(1,0,n-1,t1,t2)]<<'\n';

        }

        else

        {

            t1--;

            V[t1]=t2;

            upd(1,0,n-1,t1);

        }

    }



    return 0;

}