Cod sursa(job #3193950)

Utilizator suimerchantsui merchant suimerchant Data 16 ianuarie 2024 11:07:09
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.61 kb
#include <iostream>
#include <fstream>
using namespace std;


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


bool c;
int a,b;
int n,m;
int nst,ndr;
int aint[400005];


void init(int nod,int st,int dr)
{
    if(st==dr)
    {
        fin>>aint[nod];
    }
    else
    {
        init(nod*2,st,(st+dr)/2);
        init(nod*2+1,(st+dr)/2+1,dr);
        aint[nod]=max(aint[nod*2],aint[nod*2+1]);
    }
}


void update(int nod,int st,int dr,int a,int b)
{
    if(st==dr && st==a)
    {
        aint[nod]=b;
    }
    else
    {
        if(a>=st && a<=(st+dr)/2) update(nod*2,st,(st+dr)/2,a,b);
        else update(nod*2+1,(st+dr)/2+1,dr,a,b);
        aint[nod]=max(aint[nod*2],aint[nod*2+1]);
    }
}


void findst(int nod,int st,int dr,int a,int b)
{
    if(st==a && dr<=b)
    {
        nst=nod;
        return;
    }
    else
    {
        if(st<a) findst(nod*2+1,(st+dr)/2+1,dr,a,b);
        else findst(nod*2,st,(st+dr)/2,a,b);
    }
}
void finddr(int nod,int st,int dr,int a,int b)
{
    if(st>=a && dr==b)ndr=nod;
    else
    {
        if(dr>b) finddr(nod*2,st,(st+dr)/2,a,b);
        else finddr(nod*2+1,(st+dr)/2+1,dr,a,b);
    }
}


int query(int a,int b)
{
    findst(1,1,n,a,b);
    finddr(1,1,n,a,b);
    return max(aint[nst],aint[ndr]);
}


int main()
{
    fin>>n>>m;
    init(1,1,n);
    findst(1,1,n,3,5);
    cout<<nst;
    ///for(int i=1;i<=9;i++)cout<<aint[i]<<" ";
    ///cout<<"\n";
    for(int i=1;i<=m;i++)
    {
        fin>>c>>a>>b;
        if(c)update(1,1,n,a,b);
        else cout<<query(a,b)<<"\n";
    }
    return 0;
}