Cod sursa(job #1491972)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 26 septembrie 2015 20:07:01
Problema Lapte Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.35 kb
#include <cstdio>
#include <algorithm>
using namespace std;
int arb[4000023];
struct str
{
    int i;
    int j;
}a[240023],b[240023];
int n,l,dyn[240023],val[240023];
int query(int s,int e,int i,int j,int nod)
{
    if(i>j) return 1000000000;
    if(s==i&&j==e) return arb[nod];
    else
    {
        int mij=(s+e)/2;
        if(j<=mij) return query(s,mij,i,j,2*nod);
        else if(i>mij) return query(mij+1,e,i,j,2*nod+1);
        return min(query(s,mij,i,mij,2*nod),query(mij+1,e,mij+1,j,2*nod+1));
    }
}
void update(int s,int e,int pos,int nr,int nod)
{
    if(s==e) arb[nod]=nr;
    else
    {
        int mij=(s+e)/2;
        if(pos<=mij) update(s,mij,pos,nr,2*nod);
        else update(mij+1,e,pos,nr,2*nod+1);
        arb[nod]=min(arb[2*nod],arb[2*nod+1]);
    }
}
int comp(str a,str b)
{
    if(a.i!=b.i) return a.i<b.i;
    return a.j<b.j;
}
int main()
{
    freopen ("cover.in","r",stdin);
    freopen ("cover.out","w",stdout);
    for(int i=1;i<=4000000;i++) arb[i]=1000000000;
    scanf("%d%d",&l,&n);
    int nr;
    for(int i=1;i<=n;i++)
    {
        scanf("%d",&nr);
        update(1,n,i,nr,1);
    }
    for(int i=1;i<=l;i++)
    {
        scanf("%d%d",&a[i].i,&a[i].j);
    }
    sort(a+1,a+l+1,comp);
    int p1=1,p2;
    //b[1]=a[1];
    int pos=0;
    while(1)
    {
        int p2=p1+1;
        while(p2<=l&&a[p1].i==a[p2].i) p2++;
   //     printf("%d %d\n",p1,p2);
        if((p2==l+1)||(a[p2].j>a[p1].j))
        {
            b[++pos]=a[p1];
            if(pos>1)
            {
                if(b[pos].i==b[pos-1].j)
                {
                    if(query(1,n,b[pos].i,b[pos].i,1)<query(1,n,b[pos-1].i,b[pos-1].j,1)+query(1,n,b[pos].i,b[pos].j,1))
                    {
                        pos--;
                        b[pos].i=b[pos].j;
                    }
                }
            }
        }
        p1=p2;
        if(p1>l) break;
    }
//    for(int i=1;i<=l;i++) if(val[i]==0) printf("%d %d\n",a[i].i,a[i].j);
  //  for(int i=1;i<=pos;i++) printf("%d %d\n",b[i].i,b[i].j);
  /*  int p1=1;
    while(val[p1]==1) p1++;
    dyn[p1]=query(1,n,a[p1].i,a[p1].j,1);
*/    //printf("%d\n",dyn[p1]);
    dyn[1]=query(1,n,b[1].i,b[1].j,1);
    for(int i=2;i<=pos;i++)
    {
        dyn[i]=dyn[i-1]+query(1,n,b[i].i,b[i].j,1);
    }
    printf("%d\n",dyn[pos]);
}