Cod sursa(job #479216)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 23 august 2010 13:01:57
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.57 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.z<b.z;
}

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

int query(int x,int y)
{
    int val=0;
    for(;x>0;x-=(x&-x))
        for(int i=y ;i>0;i-=(i&-i))
            if(a[x][i]>val) val=a[x][i];
    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].x-1,cut[i].y-1);
        update(cut[i].x,cut[i].y,dp);
        if(dp>ma) ma=dp;
    }

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

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

           for(;x<=n;x+=(x&-x))
                for(int j=y;j<=n;j+=(j&-j))
                a[x][j]=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;
}