Pagini recente » Cod sursa (job #963536) | Cod sursa (job #2828010) | Cod sursa (job #1441153) | Cod sursa (job #934890) | Cod sursa (job #365399)
Cod sursa(job #365399)
#include<stdio.h>
#define infile "arbint.in"
#define outfile "arbint.out"
#define nmax 300000
int x[nmax]; //valoarea maxima din acest subarbore
int n; //numarul de elemente ale sirului
int m; //numarul de operatii
int a,b; //intervalul pe care se cauta
int poz; //pozitia care se va modifica
int val; //valoarea cu care se modifica
inline int max(int a, int b)
{
if(a>b) return a; return b;
}
void update(int nod, int st, int dr)
{
if(st==dr) { x[nod]=val; return; } //modificam valoarea pozitiei
int mij=(st+dr)/2; //mijlocul intervalului
if(poz<=mij && 2*nod<nmax) update(2*nod,st,mij); //modificam partea stanga
if(mij<poz && 2*nod+1<nmax) update(2*nod+1,mij+1,dr); //modificam partea dreapta
if(2*nod<nmax) x[nod]=x[2*nod]; //valoarea maxima din partea stanga
if(2*nod+1<nmax) x[nod]=max(x[nod],x[2*nod+1]); //valoarea maxima din partea dreapta
}
int query(int nod, int st, int dr)
{
if(a<=st && dr<=b) return x[nod]; //daca intervalul este complet, am gasit valoarea
int mij=(st+dr)/2; //mijlocul intervalului
int val=0; //valoarea maxima din acest arbore
if(a<=mij && 2*nod<nmax) val=query(2*nod,st,mij); //valoarea maxima din arborele stang
if(mij<b && 2*nod+1<nmax) val=max(val,query(2*nod+1,mij+1,dr)); //vedem daca in intervalul drept avem o valoare mai mare
return val; //returnam valoarea
}
int main()
{
int i;
freopen(infile,"r",stdin);
freopen(outfile,"w",stdout);
scanf("%d %d\n",&n,&m);
//citim cele n elemente ale sirului initial
for(poz=1;poz<=n;poz++)
{
scanf("%d",&val);
update(1,1,n); //salvam in arbore
}
//cele m operatii
while(m--)
{
scanf("%d",&i); //citim tipul operatiei
if(i)
{ //daca avem update
scanf("%d %d\n",&poz,&val);
update(1,1,n);
}
else
{ //daaca avem query
scanf("%d %d\n",&a,&b);
printf("%d\n",query(1,1,n));
}
}
fclose(stdin);
fclose(stdout);
return 0;
}