Cod sursa(job #479210)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 23 august 2010 12:46:12
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.63 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(;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);
       scanf("%d%d%d",&cut[i].x,&cut[i].y,&cut[i].z);
        //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(;y<=n;y+=(y&-y))
                a[x][y]=0;
       }
}

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

    //cit(n);
    scanf("%d%d",&n,&t);
    //cit(t);
    for(int i=1;i<=t;++i)
     rez();

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