Cod sursa(job #479198)

Utilizator doru.nituNitu Doru Constantin doru.nitu Data 23 august 2010 12:20:08
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.59 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;
}

void pune (int x,int y,int val)
{
    for(int i=x;i<=n;i+=(i&-i))
        for(int j=y;j<=n;j+=(j&-j))
            a[i][j]=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 k)
{
    int i,dp[3505],ma=0;
    memset(dp,0,sizeof(dp));
   if(k>1) for(i=1;i<=n;++i)
      pune(cut[i].y,cut[i].z,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[i]=1+query(cut[i].y-1,cut[i].z-1);
        update(cut[i].y,cut[i].z,dp[i]);
        if(dp[i]>ma) ma=dp[i];
    }

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

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

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

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