Cod sursa(job #2072511)

Utilizator ZanoxNonea Victor Zanox Data 21 noiembrie 2017 22:02:06
Problema Pq Scor 0
Compilator cpp Status done
Runda Arhiva ICPC Marime 2.95 kb
#include <fstream>
#include <iostream>
#include <algorithm>

#define range 100000

using namespace std;

int n,q,i,j,k,l;
int v[range],last[range];

pair<int,int> qr[range];


//de verificat memoria

//definite nod in arbore de intervale
//definitie init prin ampersand, cu parametrii aditionali:
        //parinte si limite
//definitie update
//definitie delete, dupa pointer
//definitie add, dupa pointer spre root, indice, valoare
        //returneaza pointer catre nodul ultim
//definitie get_max, dupa pointer si limita superioara

struct node
{
    int l1,l2,val;
    node *c1,*c2,*p;
}*root,*intv[range];

void init(node *&u,node *p,int l1,int l2)
{
    u=new node;
    u->c1=NULL;
    u->c2=NULL;
    u->l1=l1;
    u->l2=l2;
    u->val=-1;
    u->p=p;
}

void update(node *u)
{
    if(u->c1==NULL&&u->c2==NULL)
    {
        u->val=-1;
    }
    else if(u->c1!=NULL&&u->c2==NULL)
    {
        u->val=u->c1->val;
    }
    else if(u->c1==NULL&&u->c2!=NULL)
    {
        u->val=u->c2->val;
    }
    else
    {
        u->val=max(u->c1->val,u->c2->val);
    }
    if(u->p!=NULL)update(u->p);
}

node* add(node *u,int l, int val)
{
    if(u->l1==u->l2)
    {
        u->val=val;
        update(u->p);
        return u;
    }
    int lp=(u->l1+u->l2)/2;
    if(l<=lp)
    {
        if(u->c1==NULL)init(u->c1,u,u->l1,lp);
        return add(u->c1,l,val);
    }
    else
    {
        if(u->c2==NULL)init(u->c2,u,lp+1,u->l2);
        return add(u->c2,l,val);
    }
}

void del(node *u)
{
    if(u->l1==u->p->l1)
    {
        u->p->c1=NULL;
    }
    else u->p->c2=NULL;
    update(u->p);
    delete u;
}

int get_max(node *u,int lmax)
{
    if(u==NULL)return -1;
    if(u->l2<=lmax)return u->val;
    int lp=(u->l1+u->l2)/2;
    if(lp>=lmax)return get_max(u->c1,lmax);
    return max(get_max(u->c1,lmax),get_max(u->c2,lmax));
}

/*void show(node *u)
{
    if(u->l1==u->l2)cout<<"poz: "<<u->l1+1<<"    val: "<<v[u->l1]<<"   costul: "<<u->val<<'\n';
    else
    {
        if(u->c1!=NULL)show(u->c1);
        if(u->c2!=NULL)show(u->c2);
    }
}*/


int main()
{
    init(root,NULL,0,range);

    fstream f("pq.in",ios::in),g("pq.out",ios::out);
    f>>n>>q;
    for(i=0;i<n;i++)f>>v[i];
    for(i=0;i<range;i++)
    {
        last[i]=-1;
        intv[i]=NULL;
    }
    for(i=n-1;i>=0;i--)
    {
        if(last[v[i]]!=-1)
        {
            intv[i]=add(root,last[v[i]],last[v[i]]-i);
        }
        last[v[i]]=i;
    }


    i=q;
    while(i--)
    {
        f>>qr[i].first;
        qr[i].first--;
        f>>qr[i].second;
        qr[i].second--;
    }
    //vezi cum se sorteaza pair-urile
    sort(qr,qr+q);

    for(i=0,j=0;i<q;i++)
    {
        /*show(root);
        cout<<"\n\n\n\n";*/
        while(j<qr[i].first)
        {
            if(intv[j]!=NULL)del(intv[j]);
            j++;
        }
        g<<get_max(root,qr[i].second)<<'\n';
    }
}