Cod sursa(job #2330005)

Utilizator BotzkiBotzki Botzki Data 27 ianuarie 2019 19:04:47
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.66 kb
#include <fstream>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
const int NMAX=260000;
int aint[NMAX+5];
int p=1;// prin p voi afla pozitiile unde am intervale elementare(intervale cu u singur element)
void Update(int poz, int val)
{
    int cpoz;//pozitia curenta
    cpoz=poz+p-1;
    aint[cpoz]=val;
    cpoz=cpoz>>1;
    while(cpoz)
    {
      aint[cpoz]=max(aint[(cpoz<<1)], aint[(cpoz<<1)+1]);//cpoz<<1=cpoz*2;
      cpoz=cpoz>>1;
    }
}
//Interogari query
int query(int ind_nod, int st, int dr, int stc, int drc)
{
   //dreapta curenata si stanga curenta drc, stc
    if(st==stc and dr==drc)
        return aint[ind_nod];
     else
     {
         int med=(st+dr)>>1;
         if(stc<=med and drc>med)
         {
             //apelam functia recursiv
             return max(query((ind_nod<<1), st, med, stc, med), query((ind_nod<<1)+1, med+1, dr, med+1, drc));
         }
         else
         {
             if(stc<=med)
                 return query((ind_nod<<1), st, med, stc, drc);
             else
                 return query((ind_nod<<1)+1, med+1, dr, stc, drc);
         }
     }
}
int main()
{
    int n, i, x, m, a, b;
    bool ok;
    fin>>n>>m;
    //aflam cea mai mica putere a lui 2, mai mare decat n
    p=1;
    while(p<n)
        p=(p<<1);//p=p*2;
   /* for(i=1;i<=n;i++)
        fin>>aint[p+i-1];*/
      for(i=1;i<=n;i++)
      {
          fin>>x;
          Update(i, x);
      }
      for(i=1;i<=m;i++)
      {
          fin>>ok>>a>>b;
          if(ok==0)
             fout<<query(1, 1, p, a, b)<<"\n";
          else
            Update(a, b);
      }

    return 0;
}