Cod sursa(job #1022896)

Utilizator Daniel3717Aleca Daniel Adrian Daniel3717 Data 6 noiembrie 2013 09:16:32
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 1.44 kb
#include <iostream>
#include <fstream>
using namespace std;
struct arbint
{
    int x,l,r;
} v[400005];
int ax,d,n,m,i,q,a,b;
void process(int i)
{
    if (i>=2*ax)
        return;
    process(i*2);
    process(i*2+1);
    v[i].x=max(v[2*i].x,v[2*i+1].x);
    v[i].l=v[2*i].l;
    v[i].r=v[2*i+1].r;
}
void change(int i)
{
    if (i==0)
        return;
    v[i].x=max(v[2*i].x,v[2*i+1].x);
    change(i/2);
}
int extract(int i,int ll,int rr)
{
    if ((ll==v[i].l)&&(rr==v[i].r))
        return v[i].x;
    int st=2*i,dr=2*i+1;
    if (v[st].r>=rr)
        return extract(st,ll,rr);
    if (v[dr].l<=ll)
        return extract(dr,ll,rr);
    int a=extract(dr,v[dr].l,rr);
    int b=extract(st,ll,v[st].r);
    int c=max(a,b);
    return c;
}
int main(void)
{
    FILE * f;
    f=fopen("arbint.in","r");
    ofstream g("arbint.out");
    fscanf(f,"%d%d",&n,&m);
    ax=n;
    d=0;
    v[0].x=2000000000;
    while (ax!=0)
    {
        d++;
        ax=ax/2;
    }
    d--;
    ax=(1<<d);
    for (i=0;i<n;i++)
        fscanf(f,"%d",&v[i+2*ax].x);
    for (i=2*ax;i<=4*ax;i++)
        v[i].l=v[i].r=i-2*ax+1;
    process(1);
    for (i=0;i<m;i++)
    {
        fscanf(f,"%d%d%d",&q,&a,&b);
        if (q==1)
        {
            v[2*ax+a-1].x=b;
            change((2*ax+a-1)/2);
        }
        if (q==0)
        {
            g<<extract(1,a,b)<<'\n';
        }
    }
    g.close();
    return 0;
}