Cod sursa(job #2456657)

Utilizator Catalin2002Catalin Craciun Catalin2002 Data 15 septembrie 2019 01:01:58
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.13 kb
#include <iostream>
#include <fstream>
using namespace std;

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

struct nod{

int stanga;
int dreapta;
int val;

};

int v[100005];
nod w[400005];

int maxim(int a,int b)
{
    if(a>b)
        return a;
    else
        return b;
}


void functie_creare(int pos,int stanga,int dreapta)
{
    int a,b,mijl;

    w[pos].stanga=stanga;
    w[pos].dreapta=dreapta;

    if(stanga==dreapta)
    {
        w[pos].val=v[stanga];
        return;
    }
    else
    {
        mijl=(stanga+dreapta)/2;

        functie_creare(pos*2,stanga,mijl);
        functie_creare(pos*2+1,mijl+1,dreapta);

        w[pos].val=maxim(w[pos*2].val,w[pos*2+1].val);
    }
}

int prima_operatie(int a,int b,int pos)
{
    int x,y;

    int mijl=(w[pos].stanga+w[pos].dreapta)/2;

    if(w[pos].stanga>=a&&w[pos].dreapta<=b)
        return w[pos].val;

/*    if(a==mijl&&b==mijl)
        return prima_operatie(a,b,pos*2+1);

    if(a<=mijl&&mijl<b)
    {
        x=prima_operatie(a,b,pos*2);
        y=prima_operatie(a,b,pos*2+1);

        return maxim(x,y);
    }*/

    int val2 = -1;

    if(a <= mijl)
        val2 = maxim(val2, prima_operatie(a,b,pos*2));

    if(b > mijl)
        val2 = maxim(val2, prima_operatie(a,b,pos*2+1));

    return val2;

}

void modificare(int poz_cautata,int val,int pos)
{
    int mijl=(w[pos].stanga+w[pos].dreapta)/2;

    if(w[pos].stanga==w[pos].dreapta)
    {
        w[pos].val=val;
        return;
    }

    if(poz_cautata<=mijl)
    {
        modificare(poz_cautata,val,pos*2);
    }
    else
    {
        modificare(poz_cautata,val,pos*2+1);
    }

    w[pos].val=maxim(w[pos*2].val,w[pos*2+1].val);

}


int main()
{
    int n,m,i,a,b,gunoi,t;

    fin>>n>>m;

    for(i=0;i<n;i++)
        fin>>v[i];

    functie_creare(1,0,n-1);


    for(i=1;i<=m;i++)
    {
        fin>>t>>a>>b;

        a--;
        if(t==0)
            b--;

        if(t==0)
            fout<<prima_operatie(a,b,1)<<'\n';
        else
            modificare(a,b,1);

    }






    return 0;
}