Pagini recente » Cod sursa (job #1044131) | Cod sursa (job #1135439) | Cod sursa (job #1609603) | Cod sursa (job #2159899) | Cod sursa (job #1709555)
#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";
}
}