Cod sursa(job #2050056)

Utilizator dadadadadada da dadadada Data 27 octombrie 2017 22:09:57
Problema Arbori de intervale Scor 0
Compilator cpp Status done
Runda Arhiva educationala Marime 1.79 kb
#include <cstdio>
#include <queue>

using namespace std;

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

int st[400003];
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*2].st = v[i].st , v[i*2].dr = (v[i].st+v[i].dr)/2;
          v[i*2+1].st = (v[i].st+v[i].dr)/2+1 , v[i*2+1].dr = v[i].dr , nr += 2;
        }

    for ( i = 1 ; i <= 4*n ; i ++ )
        if ( v[i].st == 0 && v[i].dr == 0 )
          v[i].st = v[i].dr = v[i].val = INF;
}

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 <= m ; i ++ ){
        scanf ( "%d" , &V );
        scanf ( "%d%d" , &x , &y );

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

            while( 1 == 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)){
                    vf = 1 , printf ( "%d\n" , v[t].val );
                    break;}
                else
                    vf--;


            }
        }

    }
}