Cod sursa(job #1709202)

Utilizator CNFBTeamCNFB Udristoiu Linca Dicu CNFBTeam Data 28 mai 2016 11:15:41
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 2.22 kb
#include <cstdio>
#include <algorithm>

const int SIZE = 1e5 + 5;
const int INFI = 0x3f3f3f3f;

int n, m, c, ans[SIZE], v[SIZE], p[SIZE];
struct str{ int x, y, z; } q[SIZE];

int my_tree[SIZE * 4];

void update_tree( int node, int left, int right, int position, int value ) {
    if( left > right || right < position || left > position )
        return;

    if( left == right ) {
        my_tree[node] = value;
        return;
    }

    int middle = left + ( right - left ) / 2;

    update_tree( node * 2, left, middle, position, value );
    update_tree( node * 2 + 1, middle + 1, right, position, value );

    my_tree[node] = std::max( my_tree[node * 2], my_tree[node * 2 + 1] );

    return;
}

int query_tree( int node, int left, int right, int start, int finish ) {
    int answer1 = -INFI, answer2 = -INFI;

    if( left > right || left > finish || start > right )
        return -1;

    if( start <= left && right <= finish )
        return my_tree[node];

    int middle = left + ( right - left ) / 2;

    answer1 = query_tree( node * 2, left, middle, start, finish );
    answer2 = query_tree( node * 2 + 1, middle + 1, right, start, finish );

    return std::max( answer1, answer2 );
}
void update_tree( int position, int value ) {
    update_tree( 1, 1, n, position, value );
    return;
}

int query_tree( int start, int finish ) {
    return query_tree( 1, 1, n, start, finish );
}

inline bool cmp( str a, str b ) {
    return a.y < b.y;
}

int main( int argc, const char *argv[] ) {

    freopen( "pq.in" , "r", stdin  );
    freopen( "pq.out", "w", stdout );

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

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

    for( int i = 1; i <= m; i ++ ) {
        scanf( "%d %d", &q[i].x, &q[i].y );
        q[i].z = i;
    }

    std::sort( q + 1, q + m + 1, cmp );

    c = 1;
    for( int i = 1; i <= n; i ++ ) {
        if( p[ v[i] ] != 0 )
            update_tree( p[ v[i] ], i - p[ v[i] ] );
        p[ v[i] ] = i;

        for( c = c; c <= m && q[c].y <= i; c ++ )
            ans[ q[c].z ] = query_tree( q[c].x, q[c].y );
    }

    for( int i = 1; i <= m; i ++ ) {
        if( ans[i] == 0 )
            printf( "%d\n", -1 );
        else
            printf( "%d\n", ans[i] );
    }

    return 0;
}