Cod sursa(job #2644209)

Utilizator Anca.ioanaMuscalagiu Anca Ioana Anca.ioana Data 23 august 2020 20:04:16
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <iostream>
#include <fstream>
#include <limits.h>
#define minn INT_MIN
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int maxim,n ,m, poz, qst, qdr, st, dr, Arbore[400066], V[100001],op,a,b;
void Citire()
{ int i;
    f>>n>>m;
    for(i=0;i<n;i++)
        f>>V[i];
}
inline void Constructie(int st, int dr, int poz)
 { if(st==dr)
    Arbore[poz]=V[st];
    else { int m=(st+dr)/2;
         Constructie(st,m,2*poz+1);
         Constructie(m+1,dr,2*poz+2);
         Arbore[poz]=max(Arbore[poz*2+1],Arbore[poz*2+2]);
         }
 }
inline void Interogare(int qst, int qdr, int st, int dr, int poz)
 { if(qst<=st&&dr<=qdr)
     {
         if(maxim<Arbore[poz])
            maxim=Arbore[poz];
            return;
     }
    //if((qdr<st)||(dr<qst))
       // return minn;
    int m=(st+dr)/2;
    if(qst<=m)
        Interogare(qst,qdr,st,m,2*poz+1);
    if(m<qdr)
        Interogare(qst,qdr,m+1,dr,2*poz+2);
    //  return max(Interogare(qst,qdr,st,m,2*poz+1),Interogare(qst,qdr,m+1,dr,2*poz+2));
 }
inline void Actualizare(int qst, int qdr, int st, int dr, int poz,int x)
 {
    if(st==qst&&dr==qdr)
       Arbore[poz]=x;
    else { int m=(st+dr)/2;
           if(qst<=m)
             Actualizare(qst,qdr,st,m,2*poz+1,x);
           if(m<qdr)
             Actualizare(qst,qdr,m+1,dr,2*poz+2,x);
           Arbore[poz]=max(Arbore[poz*2+1],Arbore[poz*2+2]);
         }
 }
int main()
{ int i;
Citire();
 Constructie(0,n-1,0);
 for(i=1;i<=m;i++)
 {f>>op>>a>>b;
  if(op==0)
    {maxim=minn;
     Interogare(a-1,b-1,0,n-1,0);
    g<<maxim<<'\n';
    }
  else { Actualizare(a-1,a-1,0,n-1,0,b);
       }
 }
f.close();
g.close();
    return 0;
}