Cod sursa(job #1947118)

Utilizator leeviiTempfli Levente2 leevii Data 30 martie 2017 19:18:16
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.6 kb
#include <iostream>
#include <fstream>
#include <vector>
#include <algorithm>

using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

struct adat
{
    int mx,a,b;
};

adat x[500005];
int a[100005];
int n;

void kiir()
{
    for(int i=1;i<=30;i++)
    {
        if(x[i].a!=0) cout<<i<<" "<<x[i].a<<" "<<x[i].b<<" "<<x[i].mx<<"\n";
    }
}

bool gen(int a,int b,int i)
{
    x[i].a=a;
    x[i].b=b;
    if(a==b) return 0;
    int f;
    f=(b-a+2)/2+a-1;
    gen(a,f,2*i);
    gen(f+1,b,2*i+1);
}

bool akt(int i, int f, int j)
{
    int a=x[j].a;
    int b=x[j].b;
    if(a==b)
    {
        x[j].mx=f;
        return 0;
    }
    int g;
    g=(b-a+2)/2+a-1;
    if(i<=g) g=2*j;
    else g=2*j+1;
    akt(i,f,g);
    x[j].mx=max(x[j*2].mx,x[j*2+1].mx);
}

int maxi(int f, int g, int j)
{
    int a=x[j].a;
    int b=x[j].b;
    int h=(b-a+2)/2+a-1;
    if(f==a && g==b) return x[j].mx;
    if(f<=h && g<=h) return maxi(f,g,j*2);
    else
    if(f>h && g>h) return maxi(f,g,j*2+1);
    else
    {
        return max(maxi(f,h,j*2),maxi(h+1,g,j*2+1));
    }


}



int main()
{
    int m;
    fin>>n>>m;
    gen(1,n,1);

    int f,g,h;

    for(int i=1;i<=n;i++)
    {
        fin>>f;
        a[i]=f;
        akt(i,f,1);
    }
    //kiir();
    //cout<<"\n\n\n\n";
    for(int i=1;i<=m;i++)
    {
        fin>>f>>g>>h;
        if(f==1)
        {
            akt(g,h,1);
        }
        else
        {
            fout<<maxi(g,h,1)<<"\n";
        }
        //kiir();
        //cout<<"\n\n\n";
    }




}