Cod sursa(job #1758117)

Utilizator dragomirmanuelDragomir Manuel dragomirmanuel Data 16 septembrie 2016 16:46:47
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.68 kb
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;
//pai=pozitie arbore de intervale

int x,y,maxi;
const int NMax = 500005;
int ai[NMax], v[NMax];

class arb
{
public:
    void query(int st,int dr, int pai);
    void update(int st,int dr, int pai);
    void build(int st, int dr, int pai);
};

void arb::build(int st,int dr,int pai)
{
    if(st==dr)
    {
        ai[pai]=v[st];
        return;
    }

    int mij=(st+dr)>>1;

    build(st,mij,2*pai);
    build(mij+1,dr,2*pai+1);

    ai[pai]=max(ai[2*pai],ai[2*pai+1]);
}

void arb::update(int st, int dr, int pai)
{
    if(st==dr)
    {
        ai[pai]=y;
        return;
    }

    int mij=(st+dr)>>1;

    if(x<=mij)
        update(st,mij,2*pai);

    else
        if(x>mij)
            update(mij+1,dr,2*pai+1);

    ai[pai]=max(ai[2*pai],ai[2*pai+1]);

}

void arb::query(int st, int dr, int pai)
{
    if(x<=st && dr<=y)
    {
        maxi=max(maxi,ai[pai]);
        return;
    }

    int mij=(st+dr)>>1;

    if(mij>=x)
        query(st,mij,2*pai);

    if(mij<y)
         query(mij+1,dr,2*pai+1);


}

int n,m;

void Read()
{  arb arbore;
    scanf("%d%d", &n, &m);

    for(int i=1; i<=n; ++i)
        scanf("%d", &v[i]);

    arbore.build(1,n,1);

    for(int i=1; i<=m; ++i)
    { int t;
        scanf("%d%d%d", &t, &x, &y);

        if(t)
            arbore.update(1,n,1);

        else
        {
        maxi=-1;

        arbore.query(1,n,1);

        printf("%d\n", maxi);
        }
    }
}

int main()
{
    freopen("arbint.in", "r", stdin);
   freopen("arbint.out", "w", stdout);

    Read();

    return 0;
}