Cod sursa(job #1723172)

Utilizator al.mocanuAlexandru Mocanu al.mocanu Data 29 iunie 2016 21:59:04
Problema Pq Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.34 kb
#include <stdio.h>
#include <algorithm>
#define pii pair<int, int>
#define x first
#define y second
#define MAX 100005
using namespace std;

int n, m, a, b, v[MAX], pos[MAX], d[MAX], next[MAX], arb[2 * MAX], t = 1, cur = 1;
pair<pii, pii> q[MAX];

bool comp(pair<pii, pii> a, pair<pii, pii> b){
	return a.y.x < b.y.x;
}

int query(int node, int s, int d, int l, int r){
	if(l <= s && d <= r)
		return arb[node];
	if(r < s || d < l)
		return 0;
	return max(query(2 * node, s, (s + d) / 2, l, r), query(2 * node + 1, (s + d) / 2 + 1, d, l, r));
}

void update(int a, int b){
	a += t - 1;
	arb[a] = b;
	a >>= 1;
	while(a){
		arb[a] = max(arb[2 * a], arb[2 * a + 1]);
		a >>= 1;
	}
}

int main(){
	freopen("pq.in", "r", stdin);
	freopen("pq.out", "w", stdout);
	scanf("%d%d", &n, &m);
	while(t < n)
		t <<= 1;
	for(int i = 1; i <= n; ++i){
		scanf("%d", &v[i]);
		if(pos[v[i]]){
			d[i] = i - pos[v[i]];
			next[pos[v[i]]] = i;
		}

		pos[v[i]] = i;
		update(i, d[i]);
	}

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

	for(int i = 0; i < m; ++i){
		for(int j = cur; j < q[i].x.x; ++j)
			if(next[j])
				update(next[j], 0);
		cur = q[i].x.x;
		int res = query(1, 1, n, q[i].x.x, q[i].x.y);
		q[i].y.y = res == 0 ? -1 : res;
	}
	sort(q, q + m, comp);
	for(int i = 0; i < m; ++i)
		printf("%d\n", q[i].y.y);
	return 0;
}