Cod sursa(job #1929854)

Utilizator Laura_CorneiLaura Maria Cornei Laura_Cornei Data 18 martie 2017 10:56:05
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.67 kb
#include <fstream>
#include <stdint.h>
#define nmax 100001
using namespace std;
fstream f1("arbint.in", ios::in);
fstream f2("arbint.out", ios::out);
int32_t n, m, aint[nmax*4], v[nmax], maxi=0;
void citire()
{
    int32_t i;
    f1>>n>>m;
    for(i=1; i<=n; i++)
        f1>>v[i];
}
void creare(int32_t poz, int32_t st, int32_t dr)
{
    if(st<dr)
    {

    int32_t max1, max2, mijl;
    mijl=(st+dr)/2;
    creare(poz*2, st, mijl);
    creare(poz*2+1, mijl+1, dr);
    max1=aint[2*poz];
    max2=aint[2*poz+1];

    if(max1>max2) aint[poz]=max1;
    else aint[poz]=max2;
    }
    else if(st==dr) aint[poz]=v[st];
}
int32_t maxim(int32_t poz, int32_t x, int32_t y, int32_t a, int32_t b)
{
    if((a<=x)&&(y<=b)) {if(maxi<aint[poz]) maxi=aint[poz];return maxi;}
    else
    {
        int32_t mijl=(x+y)/2;
        if(a<=mijl) return maxim(2*poz, x, mijl, a, b);
        if(mijl+1<=b)return maxim(2*poz+1, mijl+1, y, a, b);
    }
}
void actualizare(int32_t poz, int32_t st, int32_t dr, int32_t sc, int32_t val)
{
    if(st<dr)
    {
        int32_t mijl=(st+dr)/2;

        if(sc<=mijl)  actualizare(2*poz, st, mijl,  sc, val);
        else    actualizare(2*poz+1, mijl+1, dr,  sc, val);

        if(aint[2*poz]>aint[2*poz+1]) aint[poz]=aint[2*poz];
        else  aint[poz]=aint[2*poz+1];
    }
    else if((st==dr)&&(sc==st)) aint[poz]=val;
}
void  intrebari()
{
    int32_t i, v, a, b;
    for(i=1; i<=m; i++)
    {
        maxi=0;
        f1>>v>>a>>b;
        if(v==0) {f2<<maxim(1, 1, n, a, b)<<"\n";}
        else {actualizare(1, 1, n, a, b);}
    }
}
int main()
{
    citire();
    creare(1, 1, n);
    intrebari();
    return 0;
}