Cod sursa(job #2176711)

Utilizator andrei1299Ghiorghe Andrei Alexandru andrei1299 Data 17 martie 2018 22:31:25
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.15 kb
#include <iostream>
#include <fstream>
using namespace std;
int v[200005],n,m,N=1;

void arbint()
{
    int i;
    for(i=N-1;i>0;i--)
    {
        v[i]=max(v[i*2],v[2*i+1]);
    }
}

void update(int poz, int x)
{
    poz=poz+N-1;
    v[poz]=x;
    poz/=2;
    while(poz!=0)
    {
        v[poz]=max(v[poz*2],v[poz*2+1]);
        poz/=2;
    }
}

int query(int p, int x, int y, int st, int dr)
{
    if(x==st && y==dr)
        return v[p];
    int middle=(st+dr)/2;
    if(x>=middle) return query(2*p+1,x,y,middle,dr);
    if(y<=middle) return query(2*p,x,y,st,middle);
    return max(query(2*p,x,middle,st,middle),query(2*p+1,middle,y,middle,dr));
}

int main()
{
    int i,x,y,op;
    ifstream fin("arbint.in");
    ofstream fout("arbint.out");
    fin>>n>>m;
    while(N<n)
        N*=2;
    for(i=N;i<N+n;i++)
    {
        fin>>v[i];
    }
    arbint();
    for(i=1;i<=m;i++)
    {
        fin>>op>>x>>y;
        if(op==1) update(x,y);
        else fout<<query(1,x,y,0,N)<<"\n";/*
    for(int j=1;j<N+n;j++)
        cout<<v[j]<<" ";
    cout<<"\n";*/
    }



    fin.close();
    fout.close();
    return 0;
}