Cod sursa(job #1688467)

Utilizator calin1Serban Calin calin1 Data 13 aprilie 2016 15:22:03
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.74 kb
#include <iostream>
#include <cstdio>
#include <algorithm>

using namespace std;

int n,vec[100000],ai[100000],x,y,sol;

class arb
{
public:
    void creare(int st, int dr, int pai);
    void cautare(int st, int dr, int pai);
    void refresh(int st, int dr, int pai);

};

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

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

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

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

}

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

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

    if(st<=x && x<=mij || st<=y && y<=mij)
    {
        cautare(st,mij,2*pai);
    }
    if(x>=mij+1 && x<=dr || y>=mij+1 && y<=dr)
    {
        cautare(mij+1,dr,2*pai+1);
    }
}

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

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

    if(st<=x && x<=mij)
    {
        refresh(st,mij,2*pai);
    }
    if(x>=mij+1 && y<=dr)
    {
        refresh(mij+1,dr,2*pai+1);
    }

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

}

void citire()
{
    int m;
    arb arbore;

    scanf("%d %d\n",&n,&m);
    for(int i=1; i<=n; i++)
    {
        scanf("%d ",&vec[i]);
    }
    scanf("\n");

    arbore.creare(1,n,1);

    for(int i=0; i<m; i++)
    {
        int op;
        scanf("%d %d %d\n",&op,&x,&y);
        if(op==1)
        {
            arbore.refresh(1,n,1);
        }
        else
        {
            sol=0;
            arbore.cautare(1,n,1);
            printf("%d\n",sol);
        }
    }
}

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