Cod sursa(job #2067220)

Utilizator Vlad_lsc2008Lungu Vlad Vlad_lsc2008 Data 16 noiembrie 2017 00:37:35
Problema Pq Scor 100
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.1 kb
#include <fstream>
#include <algorithm>
#include <iostream>
using namespace std;

struct qwery
{
    int st,dr,poz,rez;
    bool operator < (const qwery &a) const
    {
        if(a.st<st) return 0;
        else if(a.st==st)
                {
                    return a.dr<dr;
                }
            else return 1;
    }

} q[100005];

bool comp(const qwery &a,const qwery &b)
{
        return a.poz<b.poz;
}

int x[100005];
int last_pos[100005];

int qs,n;

int index;
struct inter
{
    int st,dr,len;
} inter[100005];

int arbint[400005];

void update(int st,int dr,int poz,int nod,int val)
{
    if(st==dr && st==poz)
    {
        arbint[nod]=val; return ;
    }
    int mid=(st+dr)/2;
    if( poz<=mid ) update(st,mid,poz,2*nod,val);
    else update(mid+1,dr,poz,2*nod+1,val);
    arbint[nod]=max( arbint[2*nod], arbint[2*nod+1]);
}

int qwery(int st,int dr,int a,int b,int nod)
{
    if( st>=a && dr<=b) return arbint[nod];

    int maxi=-1,mid=(st+dr)/2;

    if( a<=mid ) maxi=max(maxi,qwery(st,mid,a,b,2*nod));
    if(b>mid) maxi=max( maxi, qwery(mid+1,dr,a,b,2*nod+1));
    return maxi;
}

int main()
{
    int i;
    ifstream t1("pq.in");
    ofstream t2("pq.out");
    t1>>n>>qs;
    for(i=1;i<=n;i++) t1>>x[i];
    for(i=1;i<=qs;i++)
    {
        t1>>q[i].st>>q[i].dr; q[i].poz=i;
    }

    sort(q+1,q+qs+1);

    for(i=n;i>=1;i--)
    {
        if(last_pos[ x[i] ])
        {
            index++;
            inter[index].st=i; inter[index].dr=last_pos[ x[i]];
            inter[index].len=inter[index].dr- inter[index].st;
            update(1,n,inter[index].dr,1,inter[index].len);
        }
        last_pos[ x[i]]=i;
    }

    int sol;
    for(i=1;i<=qs;i++)
    {
        while(inter[index].st< q[i].st)
        {
            update(1,n,inter[index].dr,1,0);
            index--;
        }
        sol=qwery(1,n,1,q[i].dr,1);
        if(!sol) q[i].rez=-1;
        else q[i].rez=sol;
    }

    sort(q+1,q+qs+1,comp);
    for(i=1;i<=qs;i++) t2<<q[i].rez<<'\n';

    t1.close();
    t2.close();
    return 0;
}