Cod sursa(job #2550350)

Utilizator Botzki17Botocan Cristian-Alexandru Botzki17 Data 18 februarie 2020 19:00:42
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>

using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX = 131072; ///( 2^17) care este mai mare decat 10^5- datele nr de elemente ale vectorului
const int VMIN = INT_MIN;
int aint[2* NMAX+5]; ///arborele binar de intervale va avea nr de noduri egal cu 2 * n, unde n este cea mai mare putere a lui 2 care satisface urmatoarea expresie
///2 ^(x-1) < n <= 2^x
int putere(int x)
{
  int p =1;
  while(p <x)
  {
      p = (p<<1);
  }
  return p;
}
void update(int poz, int val)
{
    aint[poz] = val;
    while(poz >=1)
    {
       poz = (poz >>1);
       aint[poz] = max(aint[poz*2], aint[poz*2 +1]);
    }
}
int query(int st, int dr)
{
    int sol = INT_MIN;
    while(st <=dr)
    {
        if(st % 2 ==1)
        {
           sol = max(sol, aint[st]);
           st ++;
        }
        if(dr % 2 ==0)
        {
           sol = max(sol, aint[dr]);
           dr--;
        }
        st = (st >>1);
        dr = (dr >>1);
    }
    return sol;
}
int main()
{
    int sizev, n, m, i, x, t, a, b;
    fin>>n>>m;
    if(n&(n-1)!=0) ///daca n nu este o putere a lui 2, trebuie sa aflu cel mai mic x astfel incat 2^(x-1) < n<= 2^x;
        sizev = putere(n);
    else
        sizev = n;
    for(i=1;i<=2*sizev-1; i++)
        aint[i] = VMIN;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        update(i + sizev - 1, x);
    }
    for(i=1;i<=m;i++)
    {
        fin>>t;
        if(t==0)
        {
            fin>>a>>b;
            fout<<query(a + sizev -1, b + sizev -1)<<"\n";
        }
        else
        {
           fin>>a>>b;
           update(a + sizev -1, b);
        }
    }
    return 0;
}