Cod sursa(job #1235277)

Utilizator tdr_drtTdr Drt tdr_drt Data 29 septembrie 2014 12:46:34
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.16 kb
#include<fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,v[100002],h[300002];

void build(int nod,int x,int y)
{
    int m=(x+y)/2;
    if(x==y) h[nod]=v[x];
    else
    {
        build(nod*2,x,m);
        build(nod*2+1,m+1,y);
        h[nod]=max(h[nod*2],h[nod*2+1]);
    }
}

void change(int nod,int x,int y,int pos,int val)
{
    int m=(x+y)/2;
    if(x==y) h[nod]=val;
    else
    {
        if(pos<=m) change(nod*2,x,m,pos,val);
       else change(nod*2+1,m+1,y,pos,val);
       h[nod]=max(h[nod*2],h[nod*2+1]);
    }
}

int ask(int nod,int x,int y,int xi,int yi)
{
    if(xi<=x&&yi>=y) return h[nod];
    int m=(x+y)/2,maxi=0;
    if(xi<=m)
    {
        maxi=max(ask(nod*2,x,m,xi,yi),maxi);
    }
    if(yi>m)
    {
        maxi=max(ask(nod*2+1,m+1,y,xi,yi),maxi);
    }
    return maxi;
}

void read()
{
    f>>n>>m;
    for(int i=1;i<=n;i++) f>>v[i];
    build(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int ok,xi,yi;
        f>>ok>>xi>>yi;
        if(ok==0) g<<ask(1,1,n,xi,yi)<<"\n";
        else change(1,1,n,xi,yi);
    }

}

int main(){
 read();
 return 0;
}