Cod sursa(job #1710680)

Utilizator alex_bucevschiBucevschi Alexandru alex_bucevschi Data 29 mai 2016 16:51:58
Problema Pq Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.83 kb
#include <bits/stdc++.h>

#define pb push_back
#define mp make_pair
#define mt make_tuple
#define ll long long
#define pii pair<int,int>
#define tii tuple <int,int,int>
#define N 200005
#define mod 1000000005
#define X first
#define Y second
#define eps 0.0000000001
#define all(x) x.begin(),x.end()
#define tot(x) x+1,x+n+1
using namespace std;
int sc[N], sol, poz, val, i, arb[N], l, r, n, q, x, p, Ll;
vector<tii>v;
unordered_map<int, int>M, R;
void upd(int nod, int l, int r) {
    if(l == r) {
        arb[nod] = val;
        return;
    }

    int m = (l + r) / 2;

    if(poz <= m)
        upd(2 * nod, l, m);
    else
        upd(2 * nod + 1, m + 1, r);

    arb[nod] = max(arb[2 * nod], arb[2 * nod + 1]);
}
void query(int nod, int a, int b) {
    if(b <= r) {
        sol = max(sol, arb[nod]);
        return;
    }

    if(a > r)
        return;

    int m = (a + b) / 2;
    query(2 * nod, a, m);
    query(2 * nod + 1, m + 1, b);
}
int main() {
    freopen("pq.in", "r", stdin);
    freopen("pq.out", "w", stdout);
    scanf("%d%d", &n, &q);

    for(i = 1; i <= n; i++) {
        cin >> x;

        if(M[x]) {
            poz = i;
            val = i - M[x];
            R[M[x]] = i;
            upd(1, 1, n);
        }

        M[x] = i;
    }

    for(i = 1; i <= q; i++) {
        cin >> l >> r;
        v.pb(mt(l, r, i));
    }

    sort(all(v));
    x = 1;
    Ll = 1;

    for(auto it : v) {
        tie(l, r, p) = it;

        for(i = Ll; i < l; i++) {
            poz = R[i];
            val = -1;

            if(poz)upd(1, 1, n);
        }

        Ll = l;
        sol = -1;
        query(1, 1, n);

        if(sol == 0)
            sol = -1;

        sc[p] = sol;
    }

    for(i = 1; i <= q; i++)
        cout << sc[i] << '\n';

    return 0;
}