Pagini recente » Cod sursa (job #2495506) | Cod sursa (job #687026) | Cod sursa (job #200381) | Cod sursa (job #2626053) | Cod sursa (job #1910844)
#include <iostream>
#include <fstream>
#define LIM 2100001
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");
int n,m;
int ArbMax[LIM]; //arborele de intervale - maxim
int Val; //valoarea adaugata
int PozI; //pozitia din vectorul initial
int inc,sf; //inceputul si sfarsitul intervalului de interes
int mx; //maximul din intervalul cautat
int max(int a,int b){
if(a>b) return a;
return b;
}
void actualizare(int nod,int st,int dr)
{
if(st==dr)
ArbMax[nod]=Val;
else{
int mij=st+(dr-st)/2;
if(PozI<=mij) actualizare(2*nod, st, mij);
else actualizare(2*nod+1, mij+1, dr);
ArbMax[nod]=max(ArbMax[2*nod],ArbMax[2*nod+1]);
}
}
void interogare(int nod,int st,int dr)
{
//3 cazuri in functie de suprapunerea [inc;sf] cu [st;dr]
//: suprapunere totala, suprapunere partiala, fara suprapunere
if(inc<=st && dr<=sf) //daca [st;dr] e inclus in [inc;sf]
{
if(mx<ArbMax[nod])
mx=ArbMax[nod];
return ;
}
else{
int mij=st+(dr-st)/2;
if(inc<=mij) interogare(2*nod, st, mij);
if(mij+1<=sf) interogare(2*nod+1, mij+1, dr);
}
}
void citire()
{
int x;
in>>n>>m;
for(int i=1;i<=n;++i)
{
in>>x;
Val=x, PozI=i;
actualizare(1,1,n);
}
}
int main()
{
citire();
//for(int i=1;i<=9;++i)
// out<<ArbMax[i]<<" ";
int x,A,B;
for(int i=1;i<=m;++i)
{
in>>x>>A>>B;
if(x==0)
{
//determina maximul din intervalul [A;B]
mx=-1, inc=A, sf=B;
interogare(1,1,n);
out<<mx<<"\n";
}
else if(x==1)
{
//schimba elementul de pe pozitia A din vectorul initial cu B
PozI=A, Val=B;
actualizare(1,1,n);
}
}
return 0;
}