Cod sursa(job #1925467)

Utilizator Cristian1997Vintur Cristian Cristian1997 Data 13 martie 2017 11:23:43
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.83 kb
#include <bits/stdc++.h>
using namespace std;
using uint = unsigned int;
using ll = long long;
using pii = pair<int, int>;
#define dbg(x) cerr<<#x": "<<x<<'\n'
#define dbg_v(x, n) cerr<<#x"[]: ";for(long long _=0;_<n;++_)cerr<<(x)[_]<<' ';cerr<<'\n'
#define all(v) v.begin(), v.end()
#define NMAX 100010
#define VMAX 100010

struct node
{
	int val;
	node *l, *r;

	node(int _val) { val = _val; l = r = nullptr; }
	node(node *n) { val = n->val; l = n->l; r = n->r; }
};
using Node = node*;

int v[NMAX], last[VMAX];
Node rev[NMAX];

Node emptyST(int l, int r)
{
	if(l == r) return new node(-1);

	int mid = (l + r) / 2;
	Node newNode = new node(-1);
	newNode->l = emptyST(l, mid);
	newNode->r = emptyST(mid + 1, r);

	return newNode;
}

Node update(Node n, int l, int r, int pos, int val)
{
	if(l == r) return new node(val);

	int mid = (l + r) / 2;
	Node newNode = new node(n);

	if(pos <= mid) newNode->l = update(n->l, l, mid, pos, val);
	else newNode->r = update(n->r, mid + 1, r, pos, val);

	newNode->val = max(newNode->l->val, newNode->r->val);
	return newNode;
}

int query(Node n, int l, int r, int a, int b)
{
	if(a <= l && r <= b) return n->val;

	int mid = (l + r) / 2, v1 = -1, v2 = -1;
	if(a <= mid) v1 = query(n->l, l, mid, a, b);
	if(mid + 1 <= b) v2 = query(n->r, mid + 1, r, a, b);

	return max(v1, v2);
}

int main()
{
	ifstream cin("pq.in");
	ofstream cout("pq.out");
	ios_base::sync_with_stdio(false);

	int i, n, q, l, r;

	cin >> n >> q;

	rev[0] = emptyST(1, n);

	for(i = 1; i <= n; ++i)
	{
		cin >> v[i];
		if(last[v[i]])
		{
			rev[i] = update(rev[i - 1], 1, n, last[v[i]], i - last[v[i]]);
		}
		else rev[i] = rev[i - 1];

		last[v[i]] = i;
	}

	for(i = 1; i <= q; ++i)
	{
		cin >> l >> r;
		cout << query(rev[r], 1, n, l, r) << '\n';
	}

	return 0;
}