Cod sursa(job #1709059)

Utilizator echipa_BoSSilorUNIBUC Harsan Bicsi Baltatu echipa_BoSSilor Data 28 mai 2016 10:45:07
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.77 kb
/*************************************************************\
~*********************ENJOY THE SILENCE***********************~
\*************************************************************/

#include <bits/stdc++.h>
using namespace std;

/*******************Debugging defines*************************/

#define ok_dump() cerr<<"OK\n"
#define var_dump(x) cerr<<#x": "<<x<<'\n'
#define arr_dump(x, n) {cerr<<#x"[]: ";\
	for(int _=0;_<n;++_) cerr<<x[_]<<" ";cerr<<'\n';}

/*************************************************************/

int T[500000];

void add(int pos, int val) {
	for(;pos;pos-=(pos&-pos)) 
		T[pos] = max(T[pos], val);
}

int query(int pos) {
	int s = -1;
	for(;pos<=100005;pos+=(pos&-pos))
		s = max(s, T[pos]);

	if(s == 0) s = -1;
	return s;
}

int main() {	
//	assert(freopen("input.txt", "r", stdin));
	ios_base::sync_with_stdio(false);
	cin.tie(NULL);
	
	ifstream fin("pq.in");
	ofstream fout("pq.out");
	
	int n, q;
	fin >> n >> q;

	vector<int> V(n + 1, 0);
	for(int i = 1; i <= n; ++i) {
		fin >> V[i];
	}

	vector<pair<int, int>> Q(q);
	vector<int> I(q), Last(100005, 0);
	vector<long long> Ans(q);

	for(int i = 0; i < q; ++i) {
		int a, b;
		fin >> a >> b;
		Q[i] = {b, a};
		I[i] = i;
	}

	sort(I.begin(), I.end(), [&Q](int a, int b) {
		return Q[a] < Q[b];
	});

	int right = 0;
	for(auto i : I) {
		int b = Q[i].first;
		int a = Q[i].second;

		assert(right <= b);

		while(right < b) {
			int elem = V[++right];

			if(Last[elem])
				add(Last[elem], right - Last[elem]);
			Last[elem] = right;
			
		}

		Ans[i] = query(a);
	}

	for(auto x : Ans) {
		fout << x << '\n';
	}

	return 0;
}

/*************************************************************\
~*********************ENJOY THE SILENCE***********************~
\*************************************************************/