Cod sursa(job #1714664)

Utilizator pas.andreiPopovici Andrei-Sorin pas.andrei Data 8 iunie 2016 23:20:26
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 1.3 kb
#include <fstream>
#include <iostream>
#include <deque>
#include <map>
#include <cstring>
#include <vector>
#include <algorithm>
#define pb push_back
#define NMAX 100005
#define INF 0x3f3f3f3f

using namespace std;

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

int v[NMAX],ai[4*NMAX], last[NMAX], val[NMAX], rez[NMAX];
vector<pair<int, int> > query[NMAX];

void updateAI(int nod, int st, int dr, int pos, int val) {
	if(st==dr) {
		ai[nod]=max(ai[nod],val);
		return;
	}

	int fs=(nod<<1),mid=(st+dr)>>1;
	if(pos<=mid) updateAI(fs,st,mid,pos,val);
	else updateAI(fs+1,mid+1,dr,pos,val);

	ai[nod]=max(ai[fs],ai[fs+1]);
}

int queryAI(int nod, int st, int dr, int qst, int qdr) {
	if(qst>dr || qdr<st) return 0;
	if(st>=qst&&dr<=qdr) return ai[nod];

	int fs=(nod<<1),mid=(st+dr)>>1;

	return max(queryAI(fs,st,mid,qst,qdr), queryAI(fs+1,mid+1,dr,qst,qdr));
}

int main() {
	int n,q,dif,i,j,x,y;

	fin>>n>>q;

	for(i=1;i<=n;++i) fin>>v[i];

	for(i=0;i<q;++i) {
		fin>>x>>y;
		query[y].pb({x,i});
	}

	for(i=1;i<=n;++i) {
		if(last[v[i]]!=0)
			updateAI(1,1,n,last[v[i]],i-last[v[i]]);

		last[v[i]]=i;
		for(j=0;j<query[i].size();++j) rez[query[i][j].second]=queryAI(1,1,n,query[i][j].first,i);
	}

	for(i=0;i<q;++i) fout<<(rez[i]==0?-1:rez[i])<<'\n';

 	return 0;
}