Cod sursa(job #1815582)

Utilizator ASTELOTudor Enescu ASTELO Data 25 noiembrie 2016 14:28:39
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.63 kb
#include<cstdio>
#include<algorithm>
using namespace std;
int v[400001],maxim;
long long vc[200001],i,j,n,m,q,start,finish,q1;
void build(long long st,long long dr)
    {
    if(st<dr)
        if(st==dr-1)
            {
            int poz=dr/2;
            v[poz]=max(v[st],v[dr]);
            }
        else
            {
            build((st+dr)/2+1,dr);
            build(st,(st+dr)/2);
            }
    }
void schimb(int poz1)
    {
    if(poz1>=2)
        {
        int poz=(poz1+1)/2;
        int st=poz*2-1;
        int dr=poz*2;
        v[poz]=max(v[st],v[dr]);
        schimb(poz);
        }
    }
void query(long long nod,long long st,long long dr)
    {
    if(start<=st&&dr<=finish)
        {
        if(maxim<v[nod])
            maxim=v[nod];
        }
    else
        {
        long long div=(st+dr)/2;
        if (start<=div&&2*nod<=n)
            query(2*nod-1,st,div);
        if (div<finish&&2*nod<=n)
            query(2*nod,div+1,dr);
        }
    }
int main ()
{
freopen("arbint.in","r",stdin);
freopen("arbint.out","w",stdout);
scanf("%lld",&n);
scanf("%lld",&q1);
for(i=1;i<=n;i++)
    scanf("%lld",&vc[i]);
q=1;
while(q<=n)
    q*=2;
q*=2;
for(i=q/2+1;i<=q/2+n;i++)
    v[i]=vc[i-q/2];
build(1,q);
n=q;
for(i=1;i<=q1;i++)
    {
    long long x,y,z;
    scanf("%lld%lld%lld",&x,&y,&z);
    long long poz=y+n/2;
    long long poz1=z+n/2;
    start=poz;
    finish=poz1;
    maxim=0;
    if(x==0)
        {
        query(2,n/2+1,n-1);
        printf("%d\n",maxim);
        }
    else
        {
        v[poz]=z;
        schimb(poz);
        }
    }
return 0;
}