Cod sursa(job #1690959)

Utilizator JibrilCernea Bernard Silvestru Jibril Data 16 aprilie 2016 13:54:21
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.49 kb
#include <fstream>
#define MAXINT 2000000000
using namespace std;
int n, m, v[100002], aint[300000], minim, sf, inc, nou, aux, i, j;
 ifstream fin("arbint.in");
 ofstream fout("arbint.out");
void arbeit(int now, int st, int dr){
    if(st==dr) aint[now]=v[st];
    else{
        int mij=(st+dr)/2;
        arbeit(2*now, st, mij);
        arbeit(2*now+1, mij+1, dr);
        aint[now]=max(aint[2*now], aint[2*now+1]);
    }
}
void querry(int nod, int st, int dr){
    if(inc<=st && sf>=dr){
        minim=max(minim, aint[nod]);
        return;
    }
    int mij=(st+dr)/2;
    if(inc<=mij) querry(2*nod, st, mij);
    if(sf>=mij+1) querry(2*nod+1, mij+1, dr);
}
void update(int nod, int st, int dr){
    if(st==dr){
        aint[nod]=j; //fout<<"   "<<aint[nod];
        return;
    }
    int mij=(st+dr)/2;

    if(nou<=mij) update(2*nod, st, mij);
    if(nou>mij) update(2*nod+1, mij+1, dr);
    aint[nod]=max(aint[2*nod], aint[2*nod+1]);
}

int main()
{
    fin>>n>>m;
    for(i=1; i<=n; i++) fin>>v[i];
    arbeit(1,1,n);
    //for(i=1; i<=2*n; i++) fout<<aint[i]<<endl;
    for(i=0; i<m; i++){
        fin>>aux;
        if(aux){
            fin>>nou>>j;
            v[nou]=j;
            update(1,1,n);
        }else{
            minim=0;
            fin>>inc>>sf;
            querry(1,1,n);
            fout<<minim<<endl;
            //fout<<inc<<"  "<<sf<<endl;
        }
    }
                //for(i=1; i<=2*n; i++) fout<<aint[i]<<endl;


    return 0;
}