Cod sursa(job #1800145)

Utilizator vancea.catalincatalin vancea.catalin Data 7 noiembrie 2016 14:22:28
Problema Cutii Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.64 kb
#include<algorithm>
#include<iostream>
#include<fstream>
#define DN 3505
#define SH short
using namespace std;
fstream fin("cutii.in",ios::in),fout("cutii.out",ios::out);
short x[DN][DN],n,t;

struct cutie
{
public:
    bool operator < (const cutie& aux)
    {
        if(a==aux.a)
        {
            if(b==aux.b) return (c>aux.c);
            return (b>aux.b);
        }
        else
            return (a<aux.a);
    }
    SH a,b,c;
};

cutie v[DN];
SH diferenta(SH val){
    return val-(val&(val-1));
}
SH query(SH a,SH b)
{
    SH i,j,minim=0;
    for(i=a;i>0;i-=diferenta(i))
        for(j=b;j>0;j-=diferenta(j))
            minim=max(minim,x[i][j]);
    return minim;
}
void update(SH a,SH b,SH val)
{
    SH i,j;
    for(int i=a;i<100;i+=diferenta(i))
        for(int j=b;j<100;j+=diferenta(j))
            x[i][j]=max(x[i][j],val);
}
void initializare(SH a,SH b)
{
    for(int i=a;i<=n;i+=diferenta(i))
        for(int j=b;j<=n;j+=diferenta(j))
            x[i][j]=0;
}
int main()
{
    SH a,b,c,i,j,aux,maxim=0;
    fin>>n>>t;
    for(i=1;i<=t;i++)
    {
        maxim=0;
        for(j=1;j<=n;j++)
        {
            fin>>a>>b>>c;
            v[j]={a,b,c};
        }
        sort(v+1,v+n+1);
        //cout<<"--------------------\n";
        for(j=1;j<=n;j++)
        {
            aux=query(v[j].b,v[j].c)+1;
            //cout<<v[j].a<<" "<<v[j].b<<" "<<v[j].c<<"\n";
            update(v[j].b,v[j].c,aux);
            maxim=max(maxim,aux);
        }
        for(j=1;j<=n;j++) initializare(v[j].b,v[j].c);

        //cout<<"maxim: "<<maxim<<"\n";
        fout<<maxim<<"\n";
    }
}