Cod sursa(job #2050848)

Utilizator dadadadadada da dadadada Data 28 octombrie 2017 11:39:44
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 2.22 kb
#include <cstdio>
#include <algorithm>

using namespace std;

#define IN "arbint.in"
#define OUT "arbint.out"

int st[400004] , a[100003];
int INF = 83930212;

struct element
{
    int val , st ,dr;
}v[800004];

bool Partial_Overlap(int x , int y , int a , int b)
{
    if ( ( x <= b && x >= a ) or ( y <= b && y >= a ) or ( a <= y && a >= x ) or ( b >= x && b <= y ) )
        return 1;
    return 0;
}

bool Total_Overlap(int x , int y , int a , int b)
{
    if ( x <= a && b <= y )
        return 1;
    return 0;
}

int n , m;

void Build()
{
    int noduri , nr , i;
    noduri = 2*n-1;
    nr = 1;
    v[1].st = 1 , v[1].dr = n;
    for ( i = 1 ; i <= 4*n && nr < noduri ; i ++)
        if(v[i].st != v[i].dr && v[i].st != 0 && v[i].dr != 0 ){
          v[i*2].st = v[i].st , v[i*2].dr = (v[i].st+v[i].dr)/2;
          if ( v[i*2].st == v[i*2].dr )
            v[i*2].val = a[v[i*2].st];
          v[i*2+1].st = (v[i].st+v[i].dr)/2+1 , v[i*2+1].dr = v[i].dr , nr += 2;
          if( v[i*2+1].st == v[i*2+1].dr )
            v[i*2+1].val = a[v[i*2+1].st];
        }



    for ( i = 4*n ; i >= 1 ; i -- )
      if ( v[i].st != 0 && v[i-1].st != 0 )
           v[i/2].val = max(v[i].val,v[i-1].val) , i --;


}


int main()
{
    int i , vf , x , y , V , t;

    freopen(IN,"r",stdin);
    freopen(OUT,"w",stdout);

    scanf ( "%d%d" , &n , &m );

    for ( i = 1 ; i <= n ; i ++ )
        scanf ( "%d" , &a[i] );

    Build();

    for ( i = 1 ; i <= m ; i ++ ){
        scanf ( "%d" , &V );
        scanf ( "%d%d" , &x , &y );

        if ( V == 0 )
        {
            vf = 1;
            st[vf] = 1;

            while( 1 == 1 && vf != -1)
            {
                t = st[vf];
                vf--;
                if (Partial_Overlap(v[t].st , v[t].dr , x , y))
                    st[++vf] = t*2 , st[++vf] = t*2+1;
                else if (Total_Overlap(v[t].st , v[t].dr , x , y)){
                    if ( t%2 == 0 )
                        if ( Total_Overlap(v[t+1].st,v[t+1].dr,x,y))
                           printf ( "%d" , max(v[t].val ,v[t+1].val ) );
                    vf = 1;
                    break;}


            }
        }

    }
}