Cod sursa(job #2182514)

Utilizator victorv88Veltan Victor victorv88 Data 22 martie 2018 13:56:37
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.47 kb
#include <iostream>
#include <fstream>
#define nmax 100005

using namespace std;

ifstream f("arbint.in");
ofstream g("arbint.out");

struct pct{
    int val, pos;
}valoare;

struct quer{
    int stanga, dreapta;
}query;

int n, tree[nmax*4],m,tip;

void calcularemax(int pozitie)
{
    tree[pozitie]=max(tree[pozitie*2],tree[pozitie*2+1]);
    return;
}

void update(int st, int dr, int pozitie)
{
    if (st==dr)
    {
        tree[pozitie]=valoare.val;
        return;
    }
    int mij=(st+dr)/2;
    if (valoare.pos<=mij)
    {
        update(st,mij,2*pozitie);
    }
    else
    {
        update(mij+1,dr,2*pozitie+1);
    }
    calcularemax(pozitie);
}

int cautaremax(int st, int dr, int pozitie)
{
    if (st>=query.stanga && dr<=query.dreapta)
    {
        return tree[pozitie];
    }
    if (st>query.dreapta || dr<query.stanga)
        return 0;
    int mij=(st+dr)/2;
    return max(cautaremax(st,mij, pozitie*2),cautaremax(mij+1,dr,pozitie*2+1));
}

int main()
{
    f >> n >> m;
    for (int i=1; i<=n; i++)
    {
        f >> valoare.val;
        valoare.pos=i;
        update(1,n,1);
    }
    for (int i=0; i<n; i++)
    {
        f >> tip;
        if (tip==1)
        {
            f >> valoare.pos >> valoare.val;
            update(1,n,1);
        }
        else
        {
            f >> query.stanga >> query.dreapta;
            g << cautaremax(1,n,1) << endl;
        }
    }
    return 0;
}