Cod sursa(job #2243804)

Utilizator Dobricean_IoanDobricean Ionut Dobricean_Ioan Data 21 septembrie 2018 14:01:46
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.54 kb
#include <fstream>
#include <algorithm>
#include <iostream>

using namespace std;

ifstream fin ("pq.in");
ofstream fout ("pq.out");

struct Q{
	
	int x, y, poz;
	bool operator < ( const Q&  ob ) const {
		return (x  < ob.x);
	
	};
	
};

void Update( int nod, int l ,int r, int poz, int val);
void Query(int node , int le , int ri , int a , int b);

const int Dim = 1e5 + 1;
Q Qr[Dim];
int Aint[Dim * 4 + 1];
int q,n,A[Dim],ma,Next[Dim],Sol[Dim];


int main() {
	
	fin >> n >> q;
	for ( int i = 1; i <= n; ++i)
		fin >> A[i];
	for (int i = 1; i <= q; ++i ) 
		fin >> Qr[i].x >> Qr[i].y, Qr[i].poz = i;
	sort(Qr + 1, Qr + 1 + q);
	int current = n;
	for ( int i = q; i >= 1; --i) {
		while ( Qr[i].x <=  current) {
			if ( Next[A[current]] ) {
				Update(1,1,n,Next[A[current]],Next[A[current]] - current);
						}

			Next[A[current]] = current;
			current--;
		}
	ma = 0;
	Query(1,1,n,Qr[i].x,Qr[i].y);
	Sol[Qr[i].poz] = (ma == 0) ? -1:ma;
	}
	for ( int i = 1; i <= q; ++i)
		fout << Sol[i] << "\n";
	
}

void Update( int nod, int l ,int r, int poz, int val) {

	if ( l == r) {
		Aint[nod] = val;
		return ;
		}
	int mj = ( l + r ) / 2;
	if ( poz <= mj )
		Update(nod * 2, l , mj, poz, val);
	else
		Update(nod * 2 + 1, mj + 1, r, poz, val); 
	Aint[nod] = max(Aint[nod * 2], Aint[nod * 2 + 1]);
	
}

void Query(int node , int le , int ri , int a , int b){
    if(a <= le and b >= ri) {
        ma = max( Aint[node], ma);
     
    return ;
    }
	int mj = (le + ri) / 2;
	if(a <= mj)
		Query(2 * node, le , mj, a , b);
	if(b > mj)
		Query(2 * node + 1, mj + 1 , ri ,a , b);
}