Cod sursa(job #2442538)

Utilizator driver71528@gmail.comTerec Andrei-Sorin [email protected] Data 24 iulie 2019 12:17:19
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.87 kb
#include <iostream>
#include <fstream>
#include <math.h>
#define left(index) index*2
#define right(index) index*2+1
#define parent(index) index/2
#define MaxN 262146
using namespace std;

int n,m;
int tree[MaxN];
int array[100001];


void create(int poz,int st,int dr)
{
    if(st==dr)
        tree[poz]=array[st];
    else
    {
        int mij=(st+dr)/2;
        create(left(poz),st,mij);
        create(right(poz),mij+1,dr);
        tree[poz]=max(tree[left(poz)],tree[right(poz)]);
    }
}

int getmax(int poz,int st,int dr,int a,int b)
{
    if(a<=st && dr<=b)
        return tree[poz];
    if(b<st || dr<a)
        return -1;
    int mij=(st+dr)/2;
    int max1 = getmax(left(poz),st,mij,a,b);
    int max2 = getmax(right(poz),mij+1,dr,a,b);
    return max(max1,max2);
}
int getpoz(int index)
{
    int poz=1;
    int st=1;
    int dr=n;
    int mij;
    while(st<dr)
    {
        mij=(st+dr)/2;
        if(index<=mij)
        {
            dr=mij;
            poz=left(poz);
        }
        else
        {
            st=mij+1;
            poz=right(poz);
        }
    }
    return poz;
}
void change(int index,int val)
{
    int poz=getpoz(index);
    tree[poz]=val;
    int Parent,othetchild;
    while(poz!=1)
    {
        Parent = parent(poz);
        othetchild = poz ^ 1;
        int max1=max(tree[othetchild],tree[poz]);
        if(max1==tree[Parent])
            break;
        tree[Parent]=max1;
        poz=Parent;
    }
}
int main()
{
    ifstream f("arbint.in");
    ofstream g("arbint.out");
    f>>n>>m;
    for(int i=1;i<=n;i++)
        f>>array[i];
    create(1,1,n);
    for(int i=1;i<=m;i++)
    {
        int c,a,b;
        f>>c>>a>>b;
        if(c==0)
            g<<getmax(1,1,n,a,b)<<'\n';
        else
            change(a,b);
    }
    f.close();
    g.close();
    return 0;
}