Cod sursa(job #982877)

Utilizator classiusCobuz Andrei classius Data 10 august 2013 13:46:02
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 0.96 kb
#include <fstream>

using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int v[400010],mx[400010];

void insert(int a,int i,int j,int x,int p){

    if(i==j){
        v[a]=mx[a]=x;
        return;
    }

    int m=(i+j)/2;
    if(p>m) insert(a*2+1,m+1,j,x,p);
    else insert(a*2,i,m,x,p);

    mx[a]=mx[a*2];
    if(mx[a*2+1]>mx[a]) mx[a]=mx[a*2+1];

    return;
}

int query(int a,int i,int j,int x,int y){

    if(x==i&&y==j)
        return mx[a];

    int m=(i+j)/2,a1=0,a2=0;

    if(x<=m) a1=query(a*2,i,m,x,(m<y ? m : y));
    if(y>m) a2=query(a*2+1,m+1,j,(x>m+1 ? x : m+1),y);


    int mx=a1;
    if(a2>mx) mx=a2;

    return mx;
}

int main()
{
    int n,m;
    f>>n>>m;

    for(int i=1;i<=n;i++){
        int x;
        f>>x;
        insert(1,1,n,x,i);
    }

    for(int i=1;i<=m;i++){
        int cd,x,y;
        f>>cd>>x>>y;

        if(cd)
            insert(1,1,n,y,x);
        else
            g<<query(1,1,n,x,y)<<'\n';
    }

    return 0;
}