Cod sursa(job #1985472)

Utilizator ATM_Constantinescu_DIma_MudragATM Constantinescu Dima Mudrag ATM_Constantinescu_DIma_Mudrag Data 27 mai 2017 22:45:03
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.64 kb
#include<iostream>
#include<fstream>
#include<algorithm>
#include<vector>
#include<utility>
#define NMAX 100005

using namespace std;

int aint[4*NMAX];
int last[NMAX];
int viz[NMAX];
int a[NMAX];
int sol[NMAX];

void update(int nod ,int st,int dr,int pos ,int val){

	if ( st >= dr )
	{
		aint[nod] = val;
		return ;
	}

	int mij = (dr+st)/2;
	if ( pos <= mij ) update(2*nod,st,mij,pos,val);
	else update(2*nod+1,mij+1,dr,pos,val);

	aint[nod] = (aint[2*nod] > aint[2*nod+1] ? aint[2*nod] :aint[2*nod+1]);

}
int query(int nod,int st,int dr,int st_b,int dr_b)
{
	if ( st >= st_b && dr <= dr_b )
	{
		return aint[nod];
	}

	int mij = (dr+st)/2;
	int scor;

	if ( st_b <= mij ) scor = query(2*nod,st,mij,st_b,dr_b);
	if ( dr_b > mij ) scor = std::max(scor,query(2*nod+1,mij+1,dr,st_b,dr_b));

	return scor;
}

int main()
{
	int n,q;
	int val,left,right;
	ifstream fin("pq.in");
	ofstream fout("pq.out");
	std::vector<std::pair<int,int> > end_at[NMAX];

	fin>>n>>q;

	for(int i = 1; i <= n ; ++i)
	{
		fin>>a[i];
	}
	for (int i = 1; i <= n ; ++i)
	{
		if ( viz[a[i]] != 0 )
		{
			last[i] = viz[a[i]];
		
		}
		else last[i] = -1;
		viz[a[i]]=i;

	}
	for (int i = 0; i < q; ++i)
	{
		fin>>left>>right;
		end_at[right].push_back(std::make_pair(left,i));

	}

	for (int i = 1 ; i <= n ; ++i)
	{
		if ( last[i] != -1)
		{
			update(1,1,n,last[i],i-last[i]);
		}
		for (int j = 0 ; j < end_at[i].size() ;++j)
		{
			sol[end_at[i][j].second] = query(1,1,n,end_at[i][j].first,i);
		}
	}

	for(int i = 0 ; i < q ; ++i)
	{
		if (sol[i] == 0 ) fout<<"-1\n";
		else fout<<sol[i]<<'\n';
	}
	return 0;
}