Cod sursa(job #2454575)

Utilizator Catalin2002Catalin Craciun Catalin2002 Data 9 septembrie 2019 12:31:52
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 2.31 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[100000];
nod w[250000];

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


int 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 v[stanga];
    }
    else
    {
        mijl=(stanga+dreapta)/2;

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

        w[pos].val=maxim(a,b);
        return w[pos].val;
    }


    return 0;
}

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+1);
        y=prima_operatie(a,b,pos*2+2);

        return maxim(x,y);
    }

    if(mijl<a)
        return prima_operatie(a,b,pos*2+2);

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

    return 0;

}

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

    int x,y;


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

    }

    if(poz_cautata<=mijl)
    {
        x=modificare(poz_cautata,val,pos*2+1);
        y=w[pos*2+2].val;
        w[pos].val=maxim(x,y);
        return w[pos].val;
    }

    if(poz_cautata>mijl)
    {
        x=modificare(poz_cautata,val,pos*2+2);
        y=w[pos*2+1].val;
        w[pos].val=maxim(x,y);
        return w[pos].val;
    }




}


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

    fin>>n>>m;

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

    gunoi=functie_creare(0,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,0)<<" ";
        else
        gunoi=modificare(a,v[b],0);

    }






    return 0;
}