Cod sursa(job #2313046)

Utilizator ionicaion ionica Data 5 ianuarie 2019 21:37:17
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
#include<stdio.h>
#include<algorithm>
using namespace std;
ifstream fin("arbint.in");
///FILE *f=fopen("arbint.in","r");
ofstream fout("arbint.out");
FILE *g=fopen("arbint.out","w");

int x,arb[1000001],n,m;

void actualizare(int nod,int st,int dr,int poz,int val)
{
    int mij;
    if(st==dr)
        arb[nod]=val;
    else
    {
        mij=(st+dr)>>1;
        if(poz<=mij)
            actualizare(2*nod,st,mij,poz,val);
        else
            actualizare(2*nod+1,mij+1,dr,poz,val);

        arb[nod]=max(arb[2*nod],arb[2*nod+1]);
    }
}

int interogare(int nod,int st,int dr,int a,int b)
{
    int mij,rez1,rez2,rez;

    if(a<=st && dr<=b)///intervalul [st,dr] este inclus in [a,b]
        return arb[nod];

    if(dr < a || b < st)
        return 0;

    rez1=rez2=0;
    mij=(st+dr)>>1;
/// if(!(mij<a||b<st))
        rez1=interogare(2*nod,st,mij,a,b);

/// if(!(dr<a||b<mij+1))
        rez2=interogare(2*nod+1,mij+1,dr,a,b);

    rez=max(rez1,rez2);
    return rez;


}

int main()
{
    int tip,a,b,i;
    fin>>n>>m;
    ///fscanf(f,"%d %d",&n, &m);
    for(i=1; i<=n; i++)
    {
        fin>>x;///x[i];
        ///fscanf(f,"%d",&x[i]);
        actualizare(1,1,n,i,x);/// nod=1, st=1, dr=n, poz=i, val=x[i]
    }
    for(i=1; i<=m; i++)
    {
        fin>>tip>>a>>b;
        ///fscanf(f,"%d %d %d",&tip,&a,&b);
        if(tip==1)
        {

            actualizare(1,1,n,a,b);///nod [st dr] poz val
        }
        else
        {
            fout<<interogare(1,1,n,a,b)<<'\n';///nod st dr [a b]
            ///fprintf(g,"%d\n",interogare_arb(1,1,n,a,b));

        }
    }
    return 0;
}