Cod sursa(job #1052760)

Utilizator deea101Andreea deea101 Data 11 decembrie 2013 19:32:59
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.1 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);
    }
}