Cod sursa(job #1716804)

Utilizator cristina_borzaCristina Borza cristina_borza Data 13 iunie 2016 19:17:47
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.1 kb
#include <algorithm>
#include <fstream>
#include <set>

#define NMAX 100005

#define se second
#define fi first

using namespace std;

ifstream f("pq.in");
ofstream g("pq.out");

int lst[NMAX] , nxt[NMAX] , arb[5 * NMAX] , ans[NMAX];
int n , q , x;

pair <int , pair <int , int> > v[NMAX];

void update(int inc , int sf , int val , int pos , int nr);
int query(int inc , int sf , int a , int b , int nr);

int main() {
    f >> n >> q;
    for (int i = 1; i <= n; ++i) {
        f >> x;
        if(lst[x] != 0) {
            nxt[lst[x]] = i;

            update(1 , n , i - lst[x] , i , 1);
        }

        lst[x] = i;
    }

    for (int i = 1; i <= q; ++i) {
        f >> v[i].fi >> v[i].se.fi;
        v[i].se.se = i;
    }

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

    int pos = 1;
    for (int i = 1; i <= q; ++i) {
        while(pos < v[i].fi) {
            if(nxt[pos] != 0)
                update(1 , n , 0 , nxt[pos] , 1);
            ++pos;
        }

        int aux = query(1 , n , v[i].fi , v[i].se.fi , 1);
        if(!aux) {
            ans[v[i].se.se] = -1;
        }

        else {
            ans[v[i].se.se] = aux;
        }
    }

    for (int i = 1; i <= q; ++i) {
        g << ans[i] << '\n';
    }

    return 0;
}

void update(int inc , int sf , int val , int pos , int nr) {
    int mij = (inc + sf) / 2;
    if (inc == sf && inc == pos) {
        arb[nr] = val;
        return ;
    }

    if (pos <= mij) {
        update(inc , mij , val , pos , 2 * nr);
    }

    else {
        update(mij + 1, sf , val , pos , 2 * nr + 1);
    }

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

int query(int inc , int sf , int a , int b , int nr) {
    int mij = (inc + sf) / 2;

    if (a <= inc && b >= sf){
        return arb[nr];
    }

    if (b <= mij){
        return query(inc , mij , a , b , 2 * nr);
    }

    if (a > mij){
        return query(mij + 1 , sf , a , b , 2 * nr + 1);
    }

    if (a <= mij && mij <= b)
        return max(query(inc , mij , a , b ,  2 * nr) , query(mij + 1 , sf , a , b , 2 * nr + 1));
}