Cod sursa(job #1566894)

Utilizator ErikHEErik Henning ErikHE Data 12 ianuarie 2016 19:12:25
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.42 kb
#include <iostream>
#include <fstream>
using namespace std;

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

int n, m, x[400004], a, B;

void update(int nod, int st, int dr, int a, int b)  {
    int max1=0, mij;
    if (a <= st && dr <= b) {

        x[nod] = B;
    }
    else    {
        mij = (st + dr) / 2;
        if (a <= mij)
            update (2*nod, st, mij, a, b);
        if (b > mij)
            update (2*nod+1, mij+1, dr, a, b);
        if (x[2*nod] > x[2*nod+1])
            max1 = x[2*nod];
        else
            max1 = x[2*nod + 1];
        x[nod] = max1;
    }
      //x[nod]= (x[2*nod] > x[2*nod+1] ? x[2*nod]:x[2*nod+1])
}

int query (int nod, int st, int dr, int a, int b)  {
    int max1=0, max2=0, mij;
    if (a <= st && dr <= b)
        return x[nod];
    else    {
        mij = (st+dr)/2;
        if (a<=mij)
            max1=query (2*nod, st, mij, a, b);
        if (b>mij)
            max2=query (2*nod+1, mij+1, dr, a, b);
        if (max1 > max2)
            return max1;
        else
            return max2;
    }
}

int main()
{
    int i, j, a, b;
    int t;
    f>>n>>m;
    for (i=1;i<=n;i++)  {
          f>>B;
          update(1,1,n,i,i);}
    for (i=1;i<=m;i++)  {
        f>>t>>a>>b;
        if (t==0)
            g<<query(1, 1, n, a, b)<<"\n";
        else
            { B=b;
              update(1, 1, n, a, a);}
    }

    return 0;
}