Cod sursa(job #2096403)

Utilizator andr3i_kaabAndrei Ciineanu andr3i_kaab Data 29 decembrie 2017 02:53:40
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <iostream>
#include <fstream>
#include <algorithm>

using namespace std;

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

int n, m, arbi[4*100001], nr, cod, a, b, max1;

void update(int node, int st, int dr, int poz, int val)
{
    int med;

    if (st==dr)
    {
        arbi[node]=val;
        return;
    }

    med=(st+dr)/2;

    if (poz<=med)
        update(node*2, st, med, poz, val);
    else
        update(node*2+1, med+1, dr, poz, val);

    arbi[node]=max(arbi[node*2], arbi[node*2+1]);
    //arbi[node]=arbi[node*2]+arbi[node*2+1];
}

// se poate si cu int ca la pb. datorii mot
void query(int node, int st, int dr, int poz, int val)
{
    int med=(st+dr)/2;

    if (st>=a && dr<=b)
    {
        if (max1 < arbi[node]) max1=arbi[node];
        return;
        //return(arbi[node]);
    }

    //if (med>=a) max1=query(node*2, st, med, a, b);
    //if (med<b) max2=query(node*2+1, med+1, dr, a, b);
    //return max(max1, max2);

    if (a<=med) query(node*2, st, med, a, b);
    if (med<b) query(node*2+1, med+1, dr, a, b);
}

int main()
{
    int i, j;

    f>>n>>m;

    for (i=1; i<=n; i++)
    {
        f>>nr;
        update(1, 1, n, i, nr);
    }

    for (i=1; i<=m; i++)
    {
        f>>cod>>a>>b;
        if (cod==1) update(1, 1, n, a, b);
          else
                    {
                        //cout<<query(1, 1, n, a, b)<<"\n";
                        max1=-1;
                        query(1, 1, n, a, b);
                        g<<max1<<"\n";
                    }
    }
    return 0;
}