Cod sursa(job #2120831)

Utilizator VladGhetinaVlad Ghetina VladGhetina Data 2 februarie 2018 22:29:13
Problema Arbori de intervale Scor 100
Compilator cpp Status done
Runda Arhiva educationala Marime 3.01 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 >= a && y <= b)  or ( a >= x && a <= y) or ( b >= x && b <= y) )
        return 1;
    return 0;
}

bool Total_Overlap(int x , int y , int a , int b)
{
    if ( x >= a && y <= b )
        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 ; 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 , j , sol = 0 , nod;
    bool ok;

    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;
            sol = 0;

            while( 1 == 1 && vf != -1)
            {
                t = st[vf];
                vf--;

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



            }
        }

        else
        {
            ok = 0;
            vf = 1;
            st[vf] = 1;

            while ( 1 == 1 && vf != -1 )
            {
                t = st[vf];
                vf--;

                if(Total_Overlap(v[t].st,v[t].dr,x,x)){
                   nod = t;
                   break;
                }
                else if ( Partial_Overlap(v[t].st,v[t].dr,x,x))
                    st[++vf] = t*2 , st[++vf] = t*2+1;
            }


            v[nod].val = y;

                while(nod != 1)
                {
                    if ( nod%2 == 0 )
                        v[nod/2].val = max(v[nod].val,v[nod+1].val);
                    else v[nod/2].val = max(v[nod].val,v[nod-1].val);

                    nod /= 2;
                }


            }


        }


}