Cod sursa(job #479563)

Utilizator giuliastefGiulia Stef giuliastef Data 24 august 2010 14:48:12
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
// Arbori de intervale

#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int n,m,val,poz,start,finish,maximul;
int maxArb[500005];

inline int maxim (int a, int b)
{
       if(a>b)
               return a;
       return b;
}

void update(int nod, int left, int right)
{
     if(left==right)
     {
      maxArb[nod]=val;
      return;
     }
     int div=(left+right)/2;
     if(poz<=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(maximul<maxArb[nod]) maximul=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 i,x,a,b;
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
     f>>x;
     poz=i, val=x;
     update(1,1,n);
    }
    for(i=1;i<=m;i++)
    {
     f>>x>>a>>b;
     if(x==0)
     {
      maximul=-1;
      start=a, finish=b;
      query(1,1,n);
      g<<maximul<<"\n";
     }
     else
     {
         poz=a; val=b;
         update(1,1,n);
     }
    }
   return 0;
}