Cod sursa(job #1947715)

Utilizator HannaLieb Hanna Hanna Data 31 martie 2017 11:18:10
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.72 kb
#include <fstream>
#include <vector>

using namespace std;

ifstream cin("arbint.in");
ofstream cout("arbint.out");

long long n,m,i,a,b,c;

struct adat
{
    long long a,b,maxi;
};
vector<adat>f(100005);

long long fa(int a,int b, int e)
{
    f[e].a=a;
    f[e].b=b;
    f[e].maxi=0;

    if(a!=b)
    {
        fa(a,(a+b)/2,e*2);
        fa((a+b)/2+1,b,e*2+1);
    }


}

long long betesz(int i,int h, int p)
{

    if(f[i].a==f[i].b && f[i].a==h)
    {
        f[i].maxi=p;
        return p;
    }
    else
    {
        int k=0;
        if(f[i*2].a<=h && f[i*2].b>=h) k=betesz(i*2,h,p);
        else k=betesz(i*2+1,h,p);

        if(k>f[i].maxi) f[i].maxi=k;
    }
}

long long maxim(int bal, int jobb,int i)
{
    if(f[i].a==bal && f[i].b==jobb) return f[i].maxi;
    else
    {
        int k=0;

        if(f[i*2].a<=bal && f[i*2].b>=jobb) k=maxim(bal,jobb,i*2);
        else if(f[i*2+1].a<=bal && f[i*2+1].b>=jobb) k=maxim(bal,jobb,i*2+1);
        else k=max(maxim(bal,f[i*2].b,i*2),maxim(f[i*2+1].a,jobb,i*2+1));

        return k;
    }
}

long long csere(int a,int b, int i)
{
    if(f[i].a==f[i].b && f[i].a==a) f[i].maxi=b;
    else
    {
        if(f[i*2].a<=a && f[i*2].b>=a) csere(a,b,i*2);
        else csere(a,b,i*2+1);

        f[i].maxi=max(f[i*2].maxi,f[i*2+1].maxi);
    }
}

int main()
{
    cin>>n>>m;

    fa(1,n,1);

    //for(auto e : f) cout<<e.a<<" "<<e.b<<"\n";

    for(i=1;i<=n;i++)
    {
        cin>>a;
        betesz(1,i,a);
    }

    //for(i=1;i<=9;i++) cout<<f[i].maxi<<"\n";

    for(i=1;i<=m;i++)
    {
        cin>>a>>b>>c;

        if(a==0) cout<<maxim(b,c,1)<<"\n";
        else csere(b,c,1);
    }


    return 0;
}