Cod sursa(job #911796)

Utilizator alexandrul_21Niculescu Mihai alexandrul_21 Data 11 martie 2013 21:06:59
Problema Arbori de intervale Scor 50
Compilator cpp Status done
Runda Arhiva educationala Marime 1.58 kb
#include <stdio.h>
#include  <fstream>
#define INF 2000000000
using namespace std;
ofstream fout("arbint.out");
int N,M;
int *Arb,*V;
int Create(int k,int left,int right){
    if(left==right){
        Arb[k]=V[left];
        return V[left];
    }
    int m=(left+right)/2;
    int v1=Create(2*k,left,m);
    int v2=Create(2*k+1,m+1,right);
    if(v2>v1)
        v1=v2;
    Arb[k]=v1;
    return v1;
}
int Query1(int k,int a,int b,int left,int right){
    if(a<=left&&right<=b){
        return Arb[k];
    }
    int v1=-INF,v2=-INF,m=(left+right)/2;
    if(a<=m)
        v1=Query1(2*k,a,b,left,m);
    if(m+1<=b)
        v2=Query1(2*k+1,a,b,m+1,right);
    if(v1>v2)
        return v1;
    return v2;
}
int Query2(int k,int a,int b,int left,int right){
    if(left==right){
        Arb[k]=b;
        return b;
    }
    int m=(left+right)/2;
    int v1,v2;
    if(a<=m){
        v1=Query2(2*k,a,b,left,m);
        v2=Arb[2*k+1];
    }
    else{
        v1=Query2(2*k+1,a,b,m+1,right);
        v2=Arb[2*k];
    }
    if(v2>v1)
        v1=v2;
    Arb[k]=v1;
    return v1;
}
void Read(){
    freopen("arbint.in","r",stdin);
    scanf("%d %d\n",&N,&M);
    int i;
    V=new int [N+5];
    Arb=new int [3*N];
    for(i=1;i<=N;i++)
        scanf("%d ",&V[i]);
    Create(1,1,N);
    int nr,a,b;
    for(i=1;i<=M;i++){
        scanf("%d %d %d\n",&nr,&a,&b);
        if(nr==0)
            fout<<Query1(1,a,b,1,N)<<'\n';
        else
            Query2(1,a,b,1,N);
    }
    fclose(stdin);
    fout.close();
}
int main()
{
    Read();
    return 0;
}