Cod sursa(job #1758216)

Utilizator VladG26Ene Vlad-Mihai VladG26 Data 16 septembrie 2016 19:50:31
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.93 kb
#include <iostream>
#include <cstdio>
using namespace std;

struct operatie
{
    int tipulOperatiei;
    int stanga;
    int dreapta;
} vOperatii[100001];

int m,n,v[100001],a[500000],maxInterval;

void citire()
{
    scanf("%d%d",&n,&m);
    for(int i=1; i<=n; i++)
        scanf("%d",&v[i]);
    for(int i=1; i<=m; i++)
       scanf("%d%d%d",&vOperatii[i].tipulOperatiei,&vOperatii[i].stanga,&vOperatii[i].dreapta);
}

void constructieArbore(int pai,int st,int dr)
{
    if(st==dr)
    {
        a[pai]=v[st];
        return;
    }
    int mij=(st+dr)/2;
    constructieArbore(2*pai,st,mij);
    constructieArbore(2*pai+1,mij+1,dr);
    a[pai]=max(a[2*pai],a[2*pai+1]);
}

void updateArbore(int pai,int st,int dr,int cetrebuieSchimbat,int cuCeTrebuieSchimbat)
{
    if(st==dr)
    {
        a[pai]=cuCeTrebuieSchimbat;
        return;
    }
    int mij=(st+dr)/2;

    if(mij>=cetrebuieSchimbat)
        updateArbore(2*pai,st,mij,cetrebuieSchimbat,cuCeTrebuieSchimbat);
    else
        updateArbore(2*pai+1,mij+1,dr,cetrebuieSchimbat,cetrebuieSchimbat);
    a[pai]=max(a[2*pai],a[2*pai+1]);
}

void aflareMaxim(int pai,int st,int dr,int intervalS,int intervalD)
{
    if(st>=intervalS&&dr<=intervalD)
    {
        maxInterval=max(maxInterval,a[pai]);
        return;
    }
    int mij=(st+dr)/2;
    if(mij>=intervalS)
        aflareMaxim(pai*2,st,mij,intervalS,intervalD);
    if(mij<intervalD)
        aflareMaxim(pai*2+1,mij+1,dr,intervalS,intervalD);

}

int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    citire();
    constructieArbore(1,1,n);
    for(int i=1;i<=m;i++)
        if(vOperatii[i].tipulOperatiei)
        updateArbore(1,1,n,vOperatii[i].stanga,vOperatii[i].dreapta);
    else
    {
        maxInterval=0;
        aflareMaxim(1,1,n,vOperatii[i].stanga,vOperatii[i].dreapta);
        printf("%d\n",maxInterval);
    }

    return 0;
}