Cod sursa(job #2813176)

Utilizator un_fes_galbendaniel guba un_fes_galben Data 5 decembrie 2021 22:26:40
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.65 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream fin("arbint.in");
ofstream fout("arbint.out");
char buff[4096];
int pbuf=4095;
void readbuff(){
    pbuf=0;
    fin.read(buff,4095);
}
int citire(){
    int nr=0;
    if(pbuf==4095){
        readbuff();
    }
    while(buff[pbuf]<'0'||buff[pbuf]>'9'){
        pbuf++;
        if(pbuf==4095){
            readbuff();
        }
    }
    while(buff[pbuf]>='0'&&buff[pbuf]<='9'){
        nr=nr*10+buff[pbuf]-'0';
        pbuf++;
        if(pbuf==4095){
            readbuff();
        }
    }
    return nr;
}
int v[100005],aint[400005];
void update(int nod,int st,int dr,int val,int poz){
     if(st==dr){
        aint[nod]=val;return;
     }
     int mij=(st+dr)/2;
     if(poz<=mij){
        update(2*nod,st,mij,val,poz);
     }
     else if(mij<poz){
        update(2*nod+1,mij+1,dr,val,poz);
     }
     aint[nod]=max(aint[2*nod],aint[2*nod+1]);
}
int max1;
void query(int nod,int st,int dr,int a,int b){
    if(a<=st&&dr<=b){
        max1=max(max1,aint[nod]);return;
    }
    int mij=(st+dr)/2;
    if(a<=mij){
        query(2*nod,st,mij,a,b);
    }
    if(mij<b){
        query(2*nod+1,mij+1,dr,a,b);
    }
}
int main()
{
    int n,m,op,a,b;n=citire();m=citire();
    for(int i=1;i<=n;i++){
        v[i]=citire();
        update(1,1,n,v[i],i);
    }
    for(int i=1;i<=m;i++){
        op=citire();
        if(op==0){
            a=citire();b=citire();
            max1=-1;query(1,1,n,a,b);fout<<max1<<'\n';
        }
        else if(op==1){
            a=citire();b=citire();
            update(1,1,n,b,a);
        }
    }
    return 0;
}