Cod sursa(job #1948034)

Utilizator fogel.peterFogel Peter fogel.peter Data 31 martie 2017 16:59:43
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.45 kb
#include <fstream>

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

struct fa
{
    int eleje,vege,ertek;
};


fa x[1<<10];
int k,n,m,p,i,b,c;
bool a;
int general(int cs, int b, int j)
{
    x[cs].eleje=b;
    x[cs].vege=j;
    k=(b+j)>>1;
    if(b!=j)
    {
    general(cs<<1,b,k);
    general((cs<<1)+1,k+1,j);
    }
}

int akt(int cs,int poz,int p)
{
    if(x[cs].eleje==x[cs].vege) {x[cs].ertek=p; return p;}
    else
    {
        k=(x[cs].eleje+x[cs].vege)>>1;
        if(poz<=k)
            {x[cs].ertek= max(x[(cs<<1)+1].ertek,akt(cs<<1,poz,p));
        return x[cs].ertek;}
        else {x[cs].ertek=max(x[cs<<1].ertek,akt((cs<<1)+1,poz,p));
        return x[cs].ertek;}
    }
}

int lekerd(int cs,int b, int j)
{
    if(b==x[cs].eleje&&j==x[cs].vege) return x[cs].ertek;
    else
    {
         k=(x[cs].eleje+x[cs].vege)>>1;
         if(b>k) return lekerd((cs<<1)+1,b,j);
            else if(j<=k) return lekerd((cs<<1),b,j);
                else
                {
                   return max( lekerd(cs<<1,b,k), lekerd((cs<<1)+1,k+1,j) );

                }
    }
}

int main()
{
    f>>n>>m;
    general(1,1,n);
    for(i=1;i<=n;i++)
    {
        f>>p;
        akt(1,i,p);
    }
    //for(i=1;i<=2*n;i++)
      //  g<<x[i].ertek<<" ";

    for(i=1;i<=m;i++)
    {
        f>>a>>b>>c;
        if(a) akt(1,b,c);
        else g<<lekerd(1,b,c)<<"\n";
    }
    return 0;
}