Cod sursa(job #1688510)

Utilizator calin1Serban Calin calin1 Data 13 aprilie 2016 15:51:30
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.97 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
#include <fstream>

using namespace std;

int n,vec[100000],ai[400000],x,y,sol;
int lista[100000][3];
ifstream fin("arbint.in");
ofstream fout("arbint.out");

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(x<=mij)
    {
        cautare(st,mij,2*pai);
    }
    if(y>mij)
    {
        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(x<=mij)
    {
        refresh(st,mij,2*pai);
    }
    if(x>mij)
    {
        refresh(mij+1,dr,2*pai+1);
    }

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

}

void citire()
{
    int m;
    arb arbore;

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

    arbore.creare(1,n,1);

    for(int i=0; i<m; i++)
    {
        fin>>lista[i][0]>>lista[i][1]>>lista[i][2];
        //scanf("%d %d %d",&lista[i][0],&lista[i][1],&lista[i][2]);
    }
    fin.close();

    for(int i=0; i<m; i++)
    {
        x=lista[i][1];
        y=lista[i][2];
        if(lista[i][0]==1)
        {
            arbore.refresh(1,n,1);
        }
        else
        {
            sol=0;
            arbore.cautare(1,n,1);
            //printf("%d\n",sol);
            fout<<sol<<endl;
        }
    }
}

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