Cod sursa(job #479205)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 23 august 2010 12:35:58
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.54 kb
#include<cstdio>
#include<string.h>
#include<algorithm>
#define dim 8192

using namespace std;

int n,t,a[3505][3505],pz;
char c[dim+8];

struct nod
{
    int x,y,z;
}cut[3505];

inline void cit(int &x)
{
    x=0;
    while(c[pz]<'0'||c[pz]>'9')
    if(++pz==dim) fread(c,1,dim,stdin),pz=0;

    while(c[pz]>='0'&&c[pz]<='9')
    {
        x=x*10+c[pz]-'0';
        if(++pz==dim) fread(c,1,dim,stdin),pz=0;
    }
}

bool comp(nod a,nod b)
{
    return a.x<b.x;
}

void update(int x,int y,int val)
{
    for(;x<=n;x+=(x&-x))
        for(;y<=n;y+=(y&-y))
            if(a[x][y]<val) a[x][y]=val;
}

int query(int x,int y)
{
    int val=0;
    for(;x>0;x-=(x&-x))
        for(;y>0;y-=(y&-y))
            if(a[x][y]>val) val=a[x][y];
    return val;
}

void rez()
{
    int i,dp=0,ma=0;

    for(i=1;i<=n;++i)
    {
        cit(cut[i].x);
        cit(cut[i].y);
        cit(cut[i].z);
    }

    sort(cut+1,cut+n+1,comp);

    for(i=1;i<=n;++i)
    {
        dp=1+query(cut[i].y-1,cut[i].z-1);
        update(cut[i].y,cut[i].z,dp);
        if(dp>ma) ma=dp;
    }

    printf("%d\n",ma);

    for(i=1;i<=n;++i)
       {
           int x=cut[i].y;
           int y=cut[i].z;

           for(;x<=n;x+=(x&-x))
                for(;y<=n;y+=(y&-y))
                a[x][y]=0;
       }
}

int main()
{
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);

    cit(n);
    cit(t);
    for(int i=1;i<=t;++i)
     rez();

     fclose(stdin);
     fclose(stdout);
     return 0;
}