Cod sursa(job #1737431)

Utilizator catalin9898Bajenaru Catalin catalin9898 Data 3 august 2016 23:49:22
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.31 kb
#include <cstdio>
#include <cstring>

using namespace std;
int v[262144];
int n,m,pozbuff,lungime=1;
char buff[5000001];
int read()
{int x=0;
        while(buff[pozbuff]<'0'||buff[pozbuff]>'9')
        {
            if(++pozbuff==lungime){lungime=fread(buff,1,5000000,stdin);pozbuff=0;}

        }
            while(buff[pozbuff]>='0'&&buff[pozbuff]<='9')
        {
            x=x*10+buff[pozbuff]-'0';
            if(++pozbuff==lungime){lungime=fread(buff,1,5000000,stdin);pozbuff=0;}


        }
        return x;
}

void update(int t,int st, int dr, int val, int poz )
{if(st==dr){v[t]=val;return;}
int m=(st+dr)>>1;
if(poz<=m){update(t<<1,st,m,val,poz); }
else update((t<<1)+1,m+1,dr,val,poz);
v[t]=v[2*t]<=v[2*t+1]?v[t*2+1]:v[2*t];


}
int query(int t, int st, int dr, int a, int b)
{
    if(a<=st&&dr<=b)return v[t];
    int m=(st+dr)/2,i=0,j=0;
    if(a<=m){i=query(2*t,st,m,a,b); }
    if(m+1<=b){j=query(2*t+1,m+1,dr,a,b);  }
    return i>j?i:j;
}


int main()
{
    freopen("arbint.in","r",stdin);
    freopen("arbint.out","w",stdout);

int i;
n=read();
m=read();
for(i=1;i<=n;i++)update(1,1,n,read(),i);
int a,b,c;
for(i=0;i<m;i++)
{
    a=read();b=read();c=read();
    if(a==0)printf("%d\n",query(1,1,n,b,c));
    else update(1,1,n,c,b);

}



    return 0;
}