Cod sursa(job #2026076)

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

int a[100010],n,m,sol;
int x, y, c;

struct st
{
    int st, dr, val;
}tree[131000];

int fiu_st(int x)
{
    return (x*2);
}

int fiu_dr(int x)
{
    return (x*2+1);
}


void biuld (int nod, int caps, int capd)
{
    if (caps!=capd)
    {
        tree[nod].st=caps;
        tree[nod].dr=capd;
        biuld (fiu_st(nod),caps, (caps+capd)/2);
        biuld (fiu_dr(nod),(caps+capd)/2+1, capd);
        tree[nod].val=max(tree[fiu_st(nod)].val,tree[fiu_dr(nod)].val);
    }
    if (caps==capd)
    {
        tree[nod].st=caps;
        tree[nod].dr=capd;
        tree[nod].val=a[caps];
    }
}

void adauga (int nod,int poz, int vall)
{
    if (tree[nod].st!=tree[nod].dr)
    {
        if ( (tree[nod].st+tree[nod].dr)/2< poz ) adauga (nod*2+1, poz, vall);
        else adauga (nod*2, poz, vall);
        tree[nod].val=max(tree[nod*2].val,tree[nod*2+1].val);
    }
    else
    {
       // cout<<nod<<" "<<tree[nod].st;
        tree[nod].val=y;
    }
}

void verifica (int nod, int stt, int drr)
{
int mid=tree[nod].st+tree[nod].dr;
mid/=2;
if (stt==tree[nod].st && drr==tree[nod].dr) sol=max(sol,tree[nod].val);
if (stt< mid && drr<=mid) verifica (nod*2, stt, drr);
if (stt<=mid && drr>=mid+1)
{
verifica (nod*2, stt, mid);
verifica (nod*2+1, mid+1, drr);
}
if (stt>mid) verifica (nod*2+1, stt, drr);

}



int main()
{
    int i;
f>>n>>m;
for (i=1;i<=n;i++)
{
    f>>a[i];
}
biuld (1, 1, n);


for (i=1;i<=m;i++)
{
    f>>c>>x>>y;
    sol=0;
    if (c==1) adauga(1,x, y);
    else
    {
        verifica (1, x, y);
        g<<sol<<"\n";
    }
}


    return 0;
}