Cod sursa(job #1686689)

Utilizator MaraaMMihali Mara MaraaM Data 12 aprilie 2016 12:59:00
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.35 kb
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");
#define DimMax 100001
int segtree[4*DimMax+66];
int N,M;
int poz, val;
int maxi, start, finish;
void update(int,int,int);
void query(int, int,int);
void read();
void solve();

int main()
{
    read();
    solve();
    return 0;
}
void update(int nod,int left, int right)
{
    if(left==right)
    {
        segtree[nod]=val;
        return;
    }
    int mij=(left+right)/2;
    if(poz<=mij) update(2*nod,left,mij);
        else update(2*nod+1,mij+1,right);
    segtree[nod]=max(segtree[2*nod],segtree[2*nod+1]);
}
void query(int nod,int left, int right)
{
    if(start<=left&&right<=finish)
    {
        if(maxi<segtree[nod]) maxi=segtree[nod];
        return;
    }
    int mij=(left+right)/2;
    if(start<=mij) query(2*nod,left,mij);
    else query(2*nod+1,mij+1,right);
}
void read()
{   int x;
    f>>N>>M;
    for(int i=1;i<=N;i++)
    {
        f>>x;
        poz=i;val=x;
        update(1,1,N);
    }

}
void solve()
{   int x,a,b;
    for(int i=1;i<=M;i++)
    {
        f>>x>>a>>b;
        if(x==0)
        {   maxi=-1;
            start=a;
            finish=b;
            query(1,1,N);
            g<<maxi<<'\n';
        }
        else {poz=a; val=b;
              update(1,1,N);


        }
    }
}