Cod sursa(job #1709792)

Utilizator SegFaultTigersUPB-Necula Nitu Muntean SegFaultTigers Data 28 mai 2016 13:53:33
Problema Pq Scor 100
Compilator cpp Status done
Runda ONIS 2016 - Runda - 2 - ACM ICPC Romanian Programming Contest Marime 1.83 kb
#include<fstream>
#include<vector>
#include<algorithm>

#define N 100100
#define MOD 19997

using namespace std;

ifstream f("pq.in");
ofstream g("pq.out");

#define p first
#define s second
#define N 100100

int n,q,i,j,k,x,y,ua[N],aint[N*4],sol[N];

vector<pair<int,int> >inter;
vector<pair<pair<int,int>,int> >qu;

void update(int nod, int li,int ls, int poz, int val)
{
    if(li == ls)
    {
        aint[nod] = val;

        return;
    }

    int mij = (li + ls) >> 1;

    if(poz <= mij)
        update(nod << 1, li, mij, poz, val);
    else
        update((nod << 1) | 1, mij + 1, ls, poz, val);

    aint[nod] = max(aint[nod << 1], aint[(nod << 1) + 1]);
}

int query(int nod, int li, int ls, int poz)
{
    if(ls <= poz)
        return aint[nod];

    int mij = (li + ls) >> 1;

    int rez = query(nod << 1, li, mij, poz);

    if(poz > mij)
        rez = max(rez, query((nod << 1) + 1, mij + 1, ls, poz));

    return rez;
}

int main()
{
    f >> n >> q;

    for(i = 1; i <= n; ++i)
    {
        f >> x;

        if(ua[x])
            inter.push_back(make_pair(ua[x], i));

        ua[x] = i;
    }

    sort(inter.begin(), inter.end());

    for(i = 1; i <= q; ++i)
    {
        f >> x >> y;

        qu.push_back(make_pair(make_pair(x, y), i));
    }

    sort(qu.begin(), qu.end());

    j = 0;
    k = 0;

    for(i = 0; i < q; ++i)
    {
        x = qu[i].p.p;
        y = qu[i].p.s;

        while(j < inter.size() && inter[j].p < y)
        {
            update(1, 1, n, inter[j].s, inter[j].s-inter[j].p);

            ++j;
        }

        while(k < j && inter[k].p < x)
        {
            update(1,1,n, inter[k].s, 0);

            ++k;
        }

        sol[qu[i].s] = query(1, 1, n, y);
    }

    for(i = 1; i <= q; ++i)
        if(sol[i] == 0)
            g << -1 << '\n';
        else
            g << sol[i] << '\n';

    return 0;
}