Cod sursa(job #1709198)

Utilizator lookingForAChallengeUBB Cociorva Popoveniuc Salajan lookingForAChallenge Data 28 mai 2016 11:14:30
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.85 kb
#include <bits/stdc++.h>

using namespace std;

#define ll long long
#define pb push_back
#define mp make_pair
#define pii pair<int, int>
#define pll pair<ll, ll>
#define all(x) (x).begin(), (x).end()
#define fi first
#define se second

const int nmax = 100005;

int n, q;
int a[nmax], dist[nmax], freq[nmax];
int aint[nmax * 4];
vector< pair< int, pair<int, int> > > v;
int ans[nmax];

void query(int node, int st, int dr, int a, int b, int &maxx) {
	if (a <= st && dr <= b) {
		maxx = max(maxx, aint[node]);
	} else {
		int mij = (st + dr) / 2;
		if (a <= mij)
			query(node * 2, st, mij, a, b, maxx);
		if (b > mij) {
			query(node * 2 + 1, mij + 1, dr, a, b, maxx);
		}
	}
}

void update(int node, int st, int dr, int pos, int val) {
	if (st == dr) {
		aint[node] = val;
	} else {
		int mij = (st + dr) / 2;
		if (pos <= mij) {
			update(node * 2, st, mij, pos, val);
		} else {
			update(node * 2 + 1, mij + 1, dr, pos, val);
		}
		aint[node] = max(aint[node * 2], aint[node * 2 + 1]);
	}
}

int main() {
	cin.sync_with_stdio(false);

	freopen("pq.in", "r", stdin);
	freopen("pq.out", "w", stdout);

	for (int i = 0; i < nmax * 4; ++i) {
		aint[i] = -1;
	}

	cin >> n >> q;
	for (int i = 1; i <= n; ++i) {
		cin >> a[i];
		if (freq[a[i]] == 0) {
			dist[i] = -1;
		} else {
			dist[i] =  freq[ a[i] ] ;
		}
		freq[a[i]] = i;
	}

	for (int i = 1; i <= q; ++i) {
		int x, y;
		cin >> x >> y;
		v.pb(mp(y, mp(x, i)));
	}
	for (int i = 1; i <= n; ++i) {
		v.pb(mp(i, mp(0, 0) ));
	}
	sort(v.begin(), v.end());

	for (int i = 0; i < v.size(); ++i) {
		int y = v[i].first;
		int x = v[i].second.first;
		int initPos = v[i].second.second;
		if (x == 0) {
			if (dist[y] > 0) {
				update( 1, 1, n, dist[y], y - dist[y]);
			}
		} else {
			int maxx = -1;
			query(1, 1, n, x, y, maxx);
			ans[initPos] = maxx;
		}
	}


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

	return 0;
}