Cod sursa(job #1758118)

Utilizator dumitrescugeorgeGeorge Dumitrescu dumitrescugeorge Data 16 septembrie 2016 16:47:15
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;

int x,y,vec[400000],ai[30000],N,M,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)/2;
    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(x<=st&&dr<=y)
      {
          sol=max(ai[pai],sol);
          return ;
      }
    int mij=(st+dr)/2;
    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)
    {
        ai[pai]=y;
        return ;
    }

    int mij=(st+dr)/2;
    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()
{
    scanf("%d %d",&N,&M);
    arb arbore;
    for(int i=1;i<=N;i++)
        scanf("%d",&vec[i]);
    arbore.creare(1,N,1);
    for(int i=0;i<M;i++)
    {
        int p;
        scanf("%d%d%d",&p,&x,&y);
        if(p==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();
//    cout << "Hello world!" << endl;
    return 0;
}