Cod sursa(job #974971)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 18 iulie 2013 20:19:44
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.4 kb
#include <iostream>
#include <fstream>
using namespace std;
int i,v[250000],n1,n2,m,t,a,b,poz,ax;
int f1(int n)
{
    int k=0;
    int b=0;
    while (n!=1)
    {
        if (n%2!=0)
            b=1;
        k++;
        n=n/2;
    }
    if (b==1)
        k++;
    n=1;
    for (i=1;i<=k;i++)
        n=n*2;
    return n;
}
int cmx(int ind)
{
    if (v[ind*2]==0)
        v[ind*2]=cmx(ind*2);
    if (v[ind*2+1]==0)
        v[ind*2+1]=cmx(ind*2+1);
    return max(v[ind*2],v[ind*2+1]);
}
int imx(int l,int r)
{
    if (l==r)
        return v[l];
    if (l%2==1)
        return max(v[l],imx(l+1,r));
    if (r%2==1)
        return max(v[r],imx(l,r-1));
    return imx(l/2,r/2);
}
int main()
{
    FILE * f;
    f=fopen("arbint.in","r");
    ofstream g("arbint.out");
    fscanf(f,"%d%d",&n2,&m);
    n1=f1(n2);
    for (i=n1+1;i<=n1+n2;i++)
        fscanf(f,"%d",&v[i]);
    for (i=n1+n2+1;i<=n1*2+2;i++)
        v[i]=-1;
    v[1]=cmx(1);
    for (i=1;i<=m;i++)
    {
        fscanf(f,"%d%d%d",&t,&a,&b);
        if (t==1)
        {
            v[n1+a]=b;
            poz=n1+a;
            while ((ax!=v[poz])&&(poz!=1))
            {
                poz=poz/2;
                ax=v[poz];
                v[poz]=max(v[poz*2],v[poz*2+1]);
            }
        }
        if (t==0)
        {
            g<<imx(n1+a,n1+b)<<'\n';
        }
    }
    return 0;
}