Cod sursa(job #1534967)

Utilizator LegionHagiu Stefan Legion Data 24 noiembrie 2015 08:59:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
using namespace std;
int arb[300000];
int x;
void adauga(int stanga,int dreapta,int loc,int val,int careelemnt)
{
    int mijloc;
    int maxim=-1;
    if (stanga==dreapta)
    {
        arb[loc]=val;
        return;
    }
    else
    {
        mijloc=(stanga+dreapta)/2;
        if (careelemnt<=mijloc){adauga(stanga,mijloc,loc*2,val,careelemnt);}
        else{adauga(mijloc+1,dreapta,loc*2+1,val,careelemnt);}
        arb[loc]=max(arb[loc*2],arb[loc*2+1]);
    }
}
int daraspuns(int loc,int a,int b,int x,int y)
{
    int mijloc=(a+b)/2;
    int maxim=-9999999;
    if (a>=x&&b<=y)
    {
        return arb[loc];
    }
    else
    {
        if (x<=mijloc)
        {
            maxim=max(maxim,daraspuns(loc*2,a,mijloc,x,y));
        }
        if (y>mijloc)
        {
            maxim=max(maxim,daraspuns(loc*2+1,mijloc+1,b,x,y));
        }
        return maxim;
    }
}
int main()
{
    ifstream in("arbint.in");
    ofstream out("arbint.out");
    int i,n,m,y,p;
    in>>n;
    in>>m;
    for (i=1;i<=n;i++)
    {
        in>>x;
        adauga(1,n,1,x,i);
    }
    for (i=1;i<=m;i++)
    {
        in>>p;
        if (p==1)
        {
            in>>y;
            in>>x;
            adauga(1,n,1,x,y);
        }
        else
        {
            in>>x;
            in>>y;
            out<<daraspuns(1,1,n,x,y)<<"\n";
        }
    }
}