Cod sursa(job #2956766)

Utilizator and_Turcu Andrei and_ Data 20 decembrie 2022 15:38:05
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2 kb
#include <bits/stdc++.h>
#define N 400001
#define M 400001
using namespace std;


ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n,q;
vector<int>a;
vector<int>arbore_intervale( N,-1 );

inline int Generare(int st,int dr,int poz)
{
    if( st==dr )
    {
        return arbore_intervale[poz]=a[st];
    }
    int mij=(st+dr)/2;
    return arbore_intervale[poz]=max(
                                    Generare( st,mij,2*poz+1 ),
                                    Generare( mij+1,dr,2*poz+2 )
                                    );
}

int Maxim(int st,int dr,int poz,int x,int y)
{
    /// st dr intervalull | x,y intrevarea | poz- coresp c=lui st dr
    int mij=(st+dr)/2;
    if( x<=st and dr<=y )return arbore_intervale[poz];
    if( dr<x or y<st )return -1;
    else
    {
        return   max(
                        Maxim(st,mij,2*poz+1,x,y),
                        Maxim(mij+1,dr,2*poz+2,x,y)
                    );
    }
}

int Update( int st,int dr,int poz,int index,int val )
{
    int mij=(st+dr)/2;
    if( st<=index and index<=dr )
    {
        if( st==dr )
        {
            arbore_intervale[poz]=val;
            a[index]=val;
            return val;
        }
        arbore_intervale[poz]=max(
                                        Update(st,mij,2*poz+1,index,val),
                                        Update(mij+1,dr,2*poz+2,index,val)
                                        );
    }
    return arbore_intervale[poz];
}

void Citire()
{
    fin >> n >> q;
    a.resize(n+1);
    for(int i=1;i<=n;i++)
        fin >> a[i];
    Generare(1,n,0);
//    for(int i=0;i<= 20 ;i++)
//        cout << i <<"  " << arbore_intervale[i] << "\n";
    for(int i=1;i<=q;i++)
    {
        int x,y,op;
        fin >> op >> x >> y;
        if( op )
        {
            /// a[x]=y;
            Update( 1,n,0,x,y );
        }
        else
        {
//            cout << 1;
            /// max din [x,y]
            fout << Maxim(1,n,0,x,y) << '\n';
        }
    }


}






int main()
{
    Citire();
    return 0;
}