Cod sursa(job #2515868)

Utilizator DeniszPop Denis Denisz Data 29 decembrie 2019 17:44:17
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.39 kb
#include <iostream>
#include <fstream>
#define lg 100005
using namespace std;
int init[lg],t[4*lg+200],a,b,rez;
inline int max(int a,int b)
{
    return a>b?a:b;
}

//costr arb
void construiesc(int st,int dr,int poz)
{
    if (st==dr)
    {
        init[st]=poz;
        return ;
    }

    int x=(st+dr)/2;
    construiesc(st,x,2*poz);
    construiesc(x+1,dr,2*poz+1);
}

//********ACTUALIZARE
void actualizare(int poz,int val)
{
    int x=init[poz];
    t[x]=val;
    x>>=1;
    while(x)
    {
        t[x]=max(t[2*x],t[2*x+1]);
        x>>=1;
    }
}
//***************INTEROGARE
void interogare(int st,int dr,int poz)
{
    if (st>b||dr<a)
        return;
    if (a<=st&&dr<=b)
        rez=max(rez,t[poz]);
    else if (st<dr)
    {
        int x=(st+dr)/2;
        interogare(st,x,poz*2);
        interogare(x+1,dr,poz*2+1);
    }
}

int main()
{
    int i,x,n,m;
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    f>>n>>m;


    construiesc(1,n,1);


    for(i=1; i<=n; i=i+1)
    {
        f>>x;
        actualizare(i,x);
    }

//**************EFECTUARE TESTE
    for(i=1; i<=m; i++)
    {
        f>>x>>a>>b;

        if (!x)
        {
            rez=0;
            interogare(1,n,1);
            g<<rez<<"\n";
        }

        else
            actualizare(a,b);
    }
    f.close();
    g.close();
    return 0;
}