Cod sursa(job #1274989)

Utilizator lokixdSebastian lokixd Data 24 noiembrie 2014 17:18:21
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.58 kb
#include<cstdio>
#include<vector>
#define bit(x) ((x)&(-x))
#include<algorithm>
#include<cmath>
 
using namespace std;
 
pair<int,pair<int,int> > c[3501];
int crt,mx,x,y,z,i,j,k,n,t,aib[3501][3501];
 
int max(int x,int y)
{
    if(x>y)
    {
        return x;
    }
    return y;
}
 
void update(pair<int,int> x,int valeur)
{
    for(x.first=x.first;x.first<=n;x.first+=bit(x.first))
    {
        for(int j=x.second;j<=n;j+=bit(j))
        {
            aib[x.first][j]=max(aib[x.first][j],valeur);
        }
    }
}
 
void erase(pair<int,int> x)
{
    for(x.first=x.first;x.first<=n;x.first+=bit(x.first))
    {
        for(int j=x.second;j<=n;j+=bit(j))
        {
            aib[x.first][j]=0;
        }
    }
}
 
int q(pair<int,int> x)
{
    int ans=0;
    for(x.first=x.first;x.first>0;x.first-=bit(x.first))
    {
        for(int j=x.second;j>0;j-=bit(j))
        {
            ans=max(ans,aib[x.first][j]);
        }
    }
    return ans;
}
 
int main()
{
    freopen("cutii.in","r",stdin);
    freopen("cutii.out","w",stdout);
    scanf("%d%d",&n,&t);
    for(i=1;i<=t;i++)
    {
        for(j=1;j<=n;j++)
        {
            scanf("%d%d%d",&x,&y,&z);
            c[j]=make_pair(x,make_pair(y,z));
        }
        sort(c+1,c+n+1);
        mx=0;
        for(k=1;k<=n;k++)
        {
            crt=q(c[k].second);
            update(c[k].second,crt+1);
            mx=max(crt+1,mx);
        }
        for(j=1;j<=n;j++)
        {
            erase(c[j].second);
        }
        printf("%d\n",mx);
    }
    return 0;
}