Cod sursa(job #1709678)

Utilizator UPB_Darius_Rares_SilviuPeace my pants UPB_Darius_Rares_Silviu Data 28 mai 2016 13:22:11
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 2.12 kb
#include <stdio.h>
#include <string.h>
#include <algorithm>
#define oo 0x3f3f3f3f

#define NMax 100010

using namespace std;

int N, Q;
int v[NMax], p[NMax];
int arb[NMax * 6];
int r[NMax];
int vals[NMax];

struct query_t {
    int x;
    int y;
    int res;
    int index;

    bool operator< ( const query_t & other ) const {
        return y < other.y || y == other.y && x < other.x;
    }
} q[NMax];

int query(int pos, int st, int dr, int x, int y) {

    if ( x <= st && dr <= y )
        return arb[pos];

    int ret = -oo;
    int m = (st + dr) / 2;

    if ( x <= m )
        ret = max(ret, query(2 * pos, st, m, x, y));
    if ( y > m )
        ret = max(ret, query(2 * pos + 1, m + 1, dr, x, y));

    return ret;
}

void update(int pos, int st, int dr, int x, int val ) {

    if ( st == dr ) {
        arb[pos] = val;
        return;
    }

    int m = (st + dr) / 2;

    if ( x <= m )
        update(2 * pos, st, m, x, val);
    else
        update(2 * pos + 1, m + 1, dr, x, val);

    arb[pos] = max(arb[2 * pos], arb[2 * pos + 1]);

}

int main() {

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

    scanf("%d%d", &N, &Q);

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

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

    sort(q + 1, q + Q + 1);

    int pos = 1;

    for ( int i = 0; i < 6 * NMax; ++ i )
        arb[i] = - oo;
    memset(vals, 0x3f, sizeof(vals));

    for ( int y = 1; y <= N; ++ y ) {

        int val = oo;

        if ( p[v[y]] )
            val = vals[p[v[y]]];

        if ( p[v[y]] && val > y - p[v[y]] ) {
            update(1, 1, N, p[v[y]], y - p[v[y]] );
            vals[p[v[y]]] = y - p[v[y]];
        }
        p[v[y]] = y;

        for (; pos <= Q && q[pos].y == y; ++ pos ) {
            q[pos].res = query(1, 1, N, q[pos].x, q[pos].y);
            r[q[pos].index] = q[pos].res;
        }

    }

    for ( int i = 1; i <= Q; ++ i )
        printf("%d\n", r[i] == -oo ? -1 : r[i]);

    return 0;
}