Cod sursa(job #766038)

Utilizator cipriancxFMI - gr143 Timofte Ciprian cipriancx Data 10 iulie 2012 10:28:24
Problema Arbori de intervale Scor 30
Compilator cpp Status done
Runda Arhiva educationala Marime 1.96 kb
#include<iostream>
#include <stdio.h>

using namespace std;

long n,m,i,x,y,z;
long v[100001];


struct arbore {long long int valoare; long st; long dr; };

struct arbore arb[950000];


void creaza(long poz, long st, long dr)
{
    arb[poz].st=st;
    arb[poz].dr=dr;

    if(st!=dr)
    {
    long mij=(st+dr)/2;
    creaza(2*poz, st, mij);
    creaza(2*poz+1,mij+1,dr);
    }

}



void actualizare1(long nod, long valoare, long pozitie)
{

if(arb[nod].st<=pozitie && pozitie<= arb[nod].dr)
{

    if(arb[nod].valoare<valoare)arb[nod].valoare=valoare;
    actualizare1(2*nod, valoare, pozitie);
    actualizare1(2*nod+1,valoare,pozitie);

}
}



long actualizare2(long nod,long valoare,long pozitie)
{

if(arb[nod].st<= pozitie && pozitie<= arb[nod].dr)
{
    if(arb[nod].st==arb[nod].dr){arb[nod].valoare=valoare; return valoare;   }
    else
    {
        long fiust,fiudr;
        long max;
        fiust=actualizare2(2*nod,valoare,pozitie);
        fiudr=actualizare2(2*nod+1,valoare,pozitie);
         if(fiust<fiudr)max=fiudr; else max=fiust;

        arb[nod].valoare=max;
        return max;
    }

}
else return arb[nod].valoare;

}


long interogare(long nod, long a, long b)
{
if(a<=arb[nod].st && arb[nod].dr<=b)return arb[nod].valoare;

else
{
    long mij=(arb[nod].st+arb[nod].dr)/2;
    long fiust=0,fiudr=0;

    if(a<=mij)fiust=interogare(2*nod,a,b);
    if(b>mij)fiudr=interogare(2*nod+1,a,b);
    if(fiust<fiudr)return fiudr;
    else return fiust;


}




}












int main(void)
{

freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);

cin>>n>>m;


for(i=1; i<=n; i++) cin>>v[i];

creaza(1,1,n);






for(i=1; i<=n; i++)actualizare1(1,v[i],i);

for(i=1; i<=m; i++)
{

cin>>x>>y>>z;
if(x){long zz=actualizare2(1,z,y);   }
else
{
    long zzz=interogare(1,y,z);
   cout<<zzz<<endl;
}

}










    return 0;
}