Cod sursa(job #2300487)

Utilizator stefanut999Paul Colta stefanut999 Data 11 decembrie 2018 16:14:00
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.44 kb
#include <fstream>
#include <climits>
#define NMAX 100005
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
int m,n,a[NMAX],arb[2*NMAX];
void citire()
{fin>>n>>m;
int i;
for(i = 1; i <= n; ++i)
    fin>>a[i];
}
int min1(int x, int y)
{
    if(x < y)
        return x;
    return y;
}
void build(int nod, int st, int dr)
{
    if(st == dr)
    {
        arb[nod] = a[st];
        return;
    }
 int mijloc = (st + dr) / 2, fiu = 2 * nod;
 build(fiu, st,m);
 build(fiu + 1, m + 1, dr);
 arb[nod] = min(arb[fiu], arb[fiu+1]);
}

int query(int nod, int st, int dr, int x, int y)
{
    if(st > y || dr < x)
        return INT_MAX;
    if(x <= st && dr <= y)
        return arb[nod];
    int m = (st + dr)/2, fiu = 2 * nod;
    return min1(query(fiu, st, m, x, y), query(fiu + 1, m + 1, dr, x, y));
}

void update(int nod, int st, int dr, int x, int y)
{
    if(st > x || dr < x)
        return;
    if(st == dr)
    {
        arb[nod] = y;
        return;
    }
    int m = (st + dr)/2, fiu = 2*nod;
    update(fiu,st,m,x,y);
    update(fiu + 1, m + 1, dr, x, y);
    arb[nod] = min1(arb[fiu], arb[fiu+1]);
}

int main()
{   citire();
    build(1,1,n);
    while(m--)
    {

        int op,x,y;
        fin>>op>>x>>y;
        if(op == 1)
            fout<<query(1,1,n,x,y)<<'\n';
        else
            update(1,1,n,x,y);
    }
    fin.close();
    fout.close();
    return 0;
}