Cod sursa(job #1709555)

Utilizator ubb_912codersUBB Badila Bereczki Bodea ubb_912coders Data 28 mai 2016 12:51:00
Problema Pq Scor 0
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.21 kb
#include <fstream>
#include <set>
#include <algorithm>
using namespace std;

struct Interval
{
	int x, y;
};

struct El
{
	int a, i;
};

bool comp(Interval A, Interval B)
{
	if(A.x==B.x)
		return A.y>B.y;
	return A.x<B.x;
}

El vec[100001];
int n, i, a, x, y, q, maxim;
Interval interv[100001];
bool cmp(El a, El b)
{
	if(a.a==b.a)
		return a.i<b.i;
	return a.a<b.a;
}
int main()
{
	ifstream f("pq.in");
	ofstream g("pq.out");
	f>>n>>q;
	for(i=1; i<=n; i++)
	{
		f>>a;
		El A;
		A.a=a;
		A.i=i;
		vec[i]=A;
	}
	int nr=0;
	sort(vec+1, vec+n+1, cmp);
	for(i=1; i<=n; i++)
	{
		if(vec[i].a==vec[i+1].a)
		{
			Interval A;
			A.x=vec[i].i;
			A.y=vec[i+1].i;
			//st.insert(A);
			nr++;
			interv[nr]=A;
		}
	}
	sort(interv+1, interv+nr+1, comp);
	//f>>q;
	for(i=1; i<=q; i++)
	{
		f>>x>>y;
		Interval B;
		B.x=x;
		B.y=y;
		int st=1;
		int dr=nr;
		maxim=-1;
		while(st<=dr)
		{
			int mid=(st+dr)/2;
			if(interv[mid].x>=x && interv[mid].y<=y)
			{
				if(interv[mid].y-interv[mid].x>maxim)
					maxim=interv[mid].y-interv[mid].x;
				dr=mid-1;
			}
			else if(interv[mid].x<x)
				st=mid+1;
			else if(interv[mid].y>y)
				dr=mid-1;
		}
		g<<maxim<<"\n";
	}
}