Cod sursa(job #1053573)

Utilizator DaNutZ2UuUUBB Bora Dan DaNutZ2UuU Data 12 decembrie 2013 20:28:03
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.11 kb
#include <fstream>
#define nmax 100001
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
int arb[5*nmax],n,rez,a,b;
  
int maxim(int x,int y)
{
    if(x>y) return x;
    else return y;
}
  
void change(int s, int d, int c) // stanga, dreapta, numar nod curent
{
    if(s==d) { arb[c]=b; return; } //b-valoarea noua
      
    int m=(s+d)/2;
    if(a<=m) change(s,m,2*c); // a-pozitia
    else change(m+1,d,2*c+1);
      
    arb[c]=maxim(arb[2*c],arb[2*c+1]);
}
  
void query(int s, int d, int c) //[a,b] intervalul dorit, [s,d] intervalul curent c
{
      
    if( a<=s && d<=b )
    {
        if(arb[c]>rez) rez=arb[c];
        return;
    }
      
    int m=(s+d)/2;
    if(a<=m) query(s,m,2*c);
    if(b>m) query(m+1,d,2*c+1);
}
  
  
int main()
{
    int m,i,x;
    f>>n>>m;
    for(i=1;i<=n;i++)
    {
        f>>x; a=i; b=x;
        change(1,n,1);
    }
    for(i=1;i<=m;i++)
    {
        f>>x; f>>a>>b;
        if(!x)
        {
            rez=-1;
            query(1,n,1);
            g<<rez<<'\n';
        }
        else change(1,n,1);
    }
}