Cod sursa(job #2032676)

Utilizator CozehNita Horia Teodor Cozeh Data 5 octombrie 2017 15:47:53
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.32 kb
#include <fstream>
#include <iostream>
using namespace std;

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

long long int aint[400001];
long long int v[400001];

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

int query(int st,int dr, int p1, int p2, int nod)
{
  //  cout<<st<<" "<<dr<<" "<<p1<<" "<<p2<<"\n";
    if(p1>p2) return 0;
    if(st==p1 && dr == p2)
        return aint[nod];
    else
    {
        int mij= (st+dr)/2;
        if(p2<=mij) return query(st,mij,p1,p2,2*nod);
        else if(p1>mij) return query(mij+1,dr,p1,p2,2*nod+1);
        else return max(query(st,mij,p1,mij,2*nod),query(mij+1,dr,mij+1,p2,2*nod+1));
    }
}


int main()
{
    long long int N,M,nr1,nr2;
    int x;
    fin>>N>>M;
    int i;
    for(i = 1; i <= N; i++)
    {
        fin>>v[i];
        update(1,N,i,1);
    }
    for(i = 1; i <= M; i++)
    {

        fin>>x>>nr1>>nr2;
        if(x == 1)
        {
            v[nr1]=nr2;
            update(1,N,nr1,1);
        }
        else
        {
            fout<<query(1,N,nr1,nr2,1)<<"\n";
        }
    }


}