Cod sursa(job #1730094)

Utilizator KonoplyankaKonoplyanka Konoplyanka Data 16 iulie 2016 12:47:20
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.24 kb
#include <fstream>
#include <algorithm>
using namespace std;
ifstream f("cutii.in");
ofstream g("cutii.out");
int n,t,i;
short aib[3502][3502];
struct punct
{
    int a;
    int b;
    int c;
}v[1<<12];
struct cmp
{
    bool operator () (const punct &a,const punct &b)
    {
        return a.a<b.a;
    }
};
inline short query(int l,int c)
{
    int i,j;
    short rez=0;
    for(i=l;i;i-=(i&(-i)))
        for(j=c;j;j-=(j&(-j)))
            rez=max(rez,aib[i][j]);
    return rez;
}
inline void update(int l,int c,short cost)
{
    int i,j;
    for(i=l;i<=n;i+=(i&(-i)))
        for(j=c;j<=n;j+=(j&(-j)))
            aib[i][j]=max(cost,aib[i][j]);
}
inline void sterg(int l,int c)
{
    int i,j;
    for(i=l;i<=n;i+=(i&(-i)))
        for(j=c;j<=n;j+=(j&(-j)))
            aib[i][j]=0;
}
int main()
{
    f>>n>>t;
    while(t--)
    {
        short sol=0;
        for(i=1;i<=n;++i)
            f>>v[i].a>>v[i].b>>v[i].c;
        sort(v+1,v+n+1,cmp());
        for(i=1;i<=n;++i)
        {
            short po=query(v[i].b-1,v[i].c-1)+1;
            sol=max(sol,po);
            update(v[i].b,v[i].c,po);
        }
        for(i=1;i<=n;++i) sterg(v[i].b,v[i].c);
        g<<sol<<'\n';
    }
    return 0;
}