Cod sursa(job #2344035)

Utilizator NeganAlex Mihalcea Negan Data 14 februarie 2019 18:01:28
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");

int a[100050], s[250000];
void Creare(int nod,int st, int dr)
{
    if(st == dr)
    {
        s[nod] = a[st];
        return;
    }
    int mij = (st + dr) / 2;
    Creare(2 * nod, st, mij);
    Creare(2 * nod + 1, mij + 1, dr);
    s[nod] = max(s[2 * nod], s[2 * nod + 1]);

}
int Raspuns(int nod, int st, int dr, int a, int b)
{

    if(st >= a && dr <= b)
        return s[nod];

    if(dr < a || st > b)
        return 0;
    int  mij = (st + dr) / 2;

    return max(Raspuns(2 * nod, st, mij, a, b), Raspuns(2 * nod + 1, mij+1, dr, a, b));

}
int Find(int nod, int st, int dr, int poz)
{
   if(st == dr && st == poz)
    return nod;
   int mij = (st + dr) / 2;
   if(poz <= mij)
        return Find(2 * nod, st, mij, poz);
   if(poz > mij)
        return Find(2 * nod + 1, mij + 1, dr, poz);

}
void Actualizare(int nod)
{
    if(nod != 1)
    {s[nod / 2] = max(s[nod / 2 * 2], s[nod / 2 * 2 + 1]);
    Actualizare(nod / 2);}

}

int main()
{
    int m, n, x, y, z, pozs, i;
    fin >> n >> m;
    for(i = 1;i <= n;i++)
        fin >> a[i];
    Creare(1,1,n);
    for(i = 1;i <= m;i++)
    {
        fin >> x >> y >> z;
        if(x == 0)
           fout <<  Raspuns(1, 1, n, y, z)<<"\n";
        if(x == 1)
        {
            pozs =  Find(1, 1, n, y);
            s[pozs] = z;
            Actualizare(pozs);
        }
    }
    return 0;
}