Cod sursa(job #2026089)

Utilizator Johnny07Savu Ioan-Daniel Johnny07 Data 23 septembrie 2017 17:58:55
Problema Arbori de intervale Scor 40
Compilator cpp Status done
Runda Arhiva educationala Marime 1.34 kb
#include <iostream>
#include <fstream>
using namespace std;
ifstream f("arbint.in");
ofstream g("arbint.out");

int tree[200010],a[100010],n,m,sol;

void build (int nod, int st, int dr)
{
 int   mid=st+dr;
    mid/=2;
    if (st<dr)
    {
        build (nod*2, st, mid);
        build (nod*2+1, mid+1, dr);
        tree[nod]=max(tree[nod*2],tree[nod*2+1]);
    }
    else tree[nod]=a[st];
}

void schimba (int nod, int poz, int val, int st, int dr)
{
  int  mid=st+dr;
    mid/=2;
    if (st<dr)
    {
        if (poz<=mid) schimba (nod*2, poz, val, st, mid);
        else schimba (nod*2+1, poz, val, mid+1, dr);
        tree[nod]=max(tree[nod*2],tree[nod*2+1]);
    }
    else tree[nod]=val;
}

void solve (int nod, int x, int y, int st, int dr)
{
int mid=st+dr;
mid/=2;
if (x==st && y==dr) sol=max(sol,tree[nod]);
else {
    if (x<=mid)
{
    if (y<=mid) solve (nod*2, x, y, st, mid);
    if (y>mid) {solve (nod*2, x, mid, st, mid); solve (nod*2+1, mid+1, y, mid+1, dr);}
}
    else solve (nod*2+1, x, y, mid+1, dr);


}


}


int main()
{
f>>n>>m;
int i,x,y,c;
for (i=1;i<=n;i++)
{
    f>>a[i];
}
build (1, 1, n);
for (i=1;i<=m;i++)
{
    f>>c>>x>>y;
    if (c==0) {
        sol=0;
        solve(1, x, y, 1, n);
        g<<sol<<"\n";
    }
    else schimba(1, x, y, 1, n);
}

    return 0;
}