Cod sursa(job #2311882)

Utilizator NToniBoSSNicolae Tonitza NToniBoSS Data 3 ianuarie 2019 20:02:47
Problema Arbori de intervale Scor 100
Compilator cpp-64 Status done
Runda Arhiva educationala Marime 1.64 kb
#include <bits/stdc++.h>
#define LIM 1<<17
/// TONI BO$$ was here
/// #MLC

using namespace std;
char BUF[LIM];
int poz;

inline char getChar(){
    poz++;
    if(poz>=LIM){
    	fread(BUF,LIM,1,stdin);
    	poz=0;
    }
    return BUF[poz];
}

inline int getNr(){
    int r=0, semn=1;
    char ch=getChar();
    while(isdigit(ch)==0 && ch!='-') ch=getChar();
    if(ch=='-'){
        semn=-1;
        ch=getChar();
    }
    while(isdigit(ch)!=0){
        r=r*10+semn*(ch-'0');
        ch=getChar();
    }
    return r;
}

int v[100001],arbmax[200001];

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

int query(int a,int b,int st,int dr,int nod)
{
    if(st>=a && dr<=b)
    {
        return arbmax[nod];
    }
    int mij=(st+dr)/2,x,y;
    x=y=0;
    if(mij>=a)
        x=query(a,b,st,mij,2*nod);
    if(mij<b)
        y=query(a,b,mij+1,dr,2*nod+1);
    return max(x,y);
}

int main()
{
    int n,m,i,q,a,b;
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);
    n=getNr();
    m=getNr();
    for(i=1; i<=n; i++)
        v[i]=getNr();
    for(i=1; i<=n; i++)
        update(i,v[i],1,n,1);
    while(m--)
    {
        q=getNr();
        a=getNr();
        b=getNr();
        if(q==0)
            printf("%d\n",query(a,b,1,n,1));
        else
            update(a,b,1,n,1);
    }

    return 0;
}