Cod sursa(job #1403196)

Utilizator cypry97Dascalitei Ciprian cypry97 Data 27 martie 2015 09:12:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.28 kb
#include <iostream>
#include <fstream>
#include <algorithm>
using namespace std;

ifstream fin("arbint.in");
ofstream fout("arbint.out");

int n,m;
int v[(1<<18)+8];

void update(int nod, int st, int dr, int &x, int &i)
{
    if(st==dr)
        v[nod]=x;
    else
    {
        if(i<=(st+dr)/2)
            update(2*nod,st,(st+dr)/2,x,i);
        else
            update(2*nod+1,(st+dr)/2+1,dr,x,i);
        v[nod]=max(v[2*nod],v[2*nod+1]);
    }
}

int querry(int nod, int st, int dr, int &a, int &b)
{
    if(a <=st && dr<= b)
        return v[nod];
    else
    {
        if(a<=(st+dr)/2 && b>=(st+dr)/2+1)
            return max(querry(nod*2,st,(st+dr)/2,a,b),querry(nod*2+1,(st+dr)/2+1,dr,a,b));
        else if(a<=(st+dr)/2)
            return querry(nod*2,st,(st+dr)/2,a,b);
        else
            return querry(nod*2+1,(st+dr)/2+1,dr,a,b);
    }
}

void citire()
{
    fin>>n>>m;
    int i,x;
    for(i=1;i<=n;i++)
    {
        fin>>x;
        update(1,1,n,x,i);
    }
}

void rezolvare()
{
    int i,op,a,b;
    for(i=1;i<=m;i++)
    {
        fin>>op>>a>>b;
        if(op==1)
            update(1,1,n,b,a);
        else
            fout<<querry(1,1,n,a,b)<<'\n';
    }
}

int main()
{
    citire();
    rezolvare();
    return 0;
}