Cod sursa(job #654269)

Utilizator sternvladStern Vlad sternvlad Data 29 decembrie 2011 23:26:19
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>

using namespace std;

ifstream in ("arbint.in");
ofstream out ("arbint.out");
const int N=100001;
int start,finish,val,pos,maxim,maxarb[4*N+66],n,m,i;

int Maxim (int a,int b)
{
    if (a>b) return a;
        else return b;
}

void update (int nod,int left,int right)
{
        if (left==right)
        {
            maxarb[nod]=val;
            return;
        }
        int div=(left+right)/2;
        if (pos<=div) update (2*nod,left,div);
            else update (2*nod+1,div+1,right);
            maxarb[nod]=Maxim (maxarb [2*nod],maxarb[2*nod+1]);
}
void query (int nod,int left,int right)
{
    if (start<=left&&right<=finish)
    {
        if (maxim<maxarb [nod]) maxim=maxarb[nod];
        return ;
    }
    int div=(left+right)/2;
    if (start<=div) query (2*nod,left,div);
    if (div<finish) query (2*nod+1,div+1,right);
    }

int main()
{
    int x,y,z;
    in>>n>>m;
    for (i=1;i<=n;i++)
        {in>>x;
        pos=i; val=x;
        update (1,1,n);}
    for (i=1;i<=m;i++)
    {
        in>>x>>y>>z;;
        if (x==0)
        {maxim=-1;
        start=y;
        finish=z;
        query (1,1,n);
        out<<maxim<<"\n";
                  }
            else {pos=y;
            val=z;
            update (1,1,n);};
                }
    return 0;
}