Cod sursa(job #1709025)

Utilizator UNIBUC_Echipa_LachetaBicsi Nitu Velea UNIBUC_Echipa_Lacheta Data 28 mai 2016 10:37:24
Problema Pq Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.66 kb
#include <cassert>
#include <fstream>
#include <cstring>
#include <queue>
#include <algorithm>
#include <bitset>
#include <ctime>
#include <set>
#include <cmath>
#include <iomanip>
#include <map>
#include <stack>
#include <vector>
#include <bitset>

#include <fstream>
#define fin cin
#define fout cout

using namespace std;

#define FOR(i, a, n) for (int i = a; i <= n; ++i)
#define ROF(i, n, a) for (int i = n; i >= a; i--)
#define FIT(i, v) for (auto &i : v)
#define pb push_back
#define mp make_pair
#define mt make_touple
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second
#define sz(x) ((int)(x).size())
typedef long long ll;
typedef pair<int,int> pii;
const int mod = 1000000009;
ll powmod(ll a, ll b) {ll res=1; a %= mod; assert(b >= 0); for(; b; b >>= 1) {if (b & 1) res = res * a % mod; a = a * a % mod;} return res;}

const int N = 100005;

ifstream cin("pq.in");
ofstream cout("pq.out");

vector<pii> qr[N];
int A[N], n, q, lp[N], sol[N];

void upd(int p, int x) {
    if(!p) {
        return;
    }
    for(;p ; p-= p & -p) {
        A[p] = max(A[p], x);
    }
}
int qry(int p) {
    int x = 0;
    for(;p <= n; p += p & -p) {
        x = max(x, A[p]);
    }
    return x;
}
int main() {
    vector<int> v(n + 1);
    cin >> n >> q;
    FOR(i,1,n) {
        cin >> v[i];
    }
    FOR(i,1,q) {
        int x, y;
        cin >> x >> y;
        qr[y].pb({x,i});
    }
    FOR(i,1,n) {
        upd(lp[v[i]], i - lp[v[i]]);
        FIT(it,qr[i]) {
            int x = qry(it.fi);
            if(!x) {
                --x;
            }
            sol[it.se] = x;
        }
        lp[v[i]] = i;
    }
    FOR(i,1,q) {
        cout << sol[i] << "\n";
    }
    return 0;
}