Cod sursa(job #2902823)

Utilizator Teodor_AxinteAxinte Teodor-Ionut Teodor_Axinte Data 16 mai 2022 20:48:34
Problema Arbori de intervale Scor 0
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.69 kb
#include <fstream>
#include <iostream>
	
using namespace std;
	
ifstream fin("arbint.in");
ofstream fout("arbint.out");
	
const int oo=999999999;
const int N=100010;
	
int n,m,o,a,b;
int input[N],segTree[4*N+10];
	
void constructTree(int input[],int segTree[],int low,int high,int pos)
{
    if(low==high)	
    {
        segTree[pos]=input[low];
        return;
    }
    int mid=(low+high)/2;
    constructTree(input,segTree,low,mid,2*pos+1);
    constructTree(input,segTree,mid+1,high,2*pos+2);
    segTree[pos]=max(segTree[2*pos+1],segTree[2*pos+2]);
}
void updateTree(int index,int st,int dr,int val, int poz)	
{
    if(st==dr)	
    {
        segTree[index]=val;
        return;
    }
    int mij=(st+dr)/2;
    if(poz<=mij)
        updateTree(index*2+1,st,mij,val,poz);
    else
        updateTree(index*2+2,mij+1,dr,val,poz);
    segTree[index]=max(segTree[index*2+1],segTree[index*2+2]);
}	
int rangeMaxQuery(int segTree[], int Qlow, int Qhigh,int low,int high,int pos)	
{
    if(Qlow<=low && Qhigh>=high) //total overlap	
        return segTree[pos];
    if(Qlow>high || Qhigh<low) //no overlap
        return -oo;
    int mid = (low+high)/2;
    return max(rangeMaxQuery(segTree,Qlow,Qhigh,low,mid,2*pos+1),
               rangeMaxQuery(segTree,Qlow,Qhigh,mid+1,high,2*pos+2)); //double overlap
}
int main()	
{
    fin>>n>>m;	
    for(int i=0;i<n;i++)
        fin>>input[i];
    for(int i=0;i<4*n;i++)
        segTree[i]=-oo;
    constructTree(input,segTree,0,n-1,0);
	
    for(;m;m--)	
    {
        fin>>o>>a>>b;
        if(o==0)
            fout<<rangeMaxQuery(segTree,a,b,0,n-1,0)-1<<'\n';
        else
            updateTree(0,0,n-1,b,a);
    }
}