Cod sursa(job #1238165)

Utilizator radu_cebotariRadu Cebotari radu_cebotari Data 5 octombrie 2014 21:10:54
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream>
using namespace std;
ifstream in("arbint.in");
ofstream out("arbint.out");

typedef int arbint[2000005];

arbint arbore;
int n,m,x,y,z,maxim;

void update(int val,int poz,int nod,int left,int right)
{

    if(left == right){
        arbore[nod] = val;
        return;
    }
    int m = (left+right)/2;
    if(poz <= m) update(val,poz,nod*2,left,m);
    if(poz > m) update(val,poz,nod*2+1,m+1,right);
    arbore[nod] = max(arbore[nod*2],arbore[nod*2+1]);
}

void query(int nod,int left,int right,int start,int finish)
{

    if(start <= left && right <= finish){
        maxim = max(maxim,arbore[nod]);
        return;
    }
    int m = (left+right)/2;
    if(start <= m) query(nod*2,left,m,start,finish);
    if(m < finish) query(nod*2+1,m+1,right,start,finish);
}

int main()
{

    in>>n>>m;
    for(int i = 1 ; i <= n ; i++){
        in>>x;
        update(x,i,1,1,n);
    }
    for(int i = 1 ; i <= m ; i++){

        in>>x>>y>>z;
        if(x == 1)
            update(z,y,1,1,n);
        else{
            maxim = -1;
            query(1,1,n,y,z);
            out<<maxim<<"\n";
        }
    }
    return 0;
}