Cod sursa(job #2012914)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 19 august 2017 20:29:02
Problema Cutii Scor 10
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.49 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int nmax=3502;
int n;
int aib[nmax][nmax];
struct str
{
    int x;
    int y;
    int z;
    bool operator <(const str &aux) const
    {
        if(x!=aux.x) return x<aux.x;
        if(y!=aux.y) return y<aux.y;
        return z<aux.z;
    }
}v[nmax];
void citire()
{
    for(int i=1;i<=n;i++) scanf("%d%d%d",&v[i].x,&v[i].y,&v[i].z);
    sort(v+1,v+n+1);
}
void update(int p1,int p2,int val)
{
    for(int i=p1;i<=n;i+=(p1&(-p1)))
    {
        for(int j=p2;j<=n;j+=(p2&(-p2))) aib[i][j]=max(aib[i][j],val);
    }
}
int query(int p1,int p2)
{
    int ans=0;
    for(int i=p1;i>0;i-=(i&(-i)))
    {
        for(int j=p2;j>0;j-=(j&(-j))) ans=max(ans,aib[i][j]);
    }
    return ans;
}
void solve()
{
    int maxans=0;
    for(int i=1;i<=n;i++)
    {
        int ans=query(v[i].y-1,v[i].z-1);
        ans++;
        maxans=max(maxans,ans);
        if(v[i].x!=v[i+1].x)
        {
            for(int j=i;v[j].x==v[i].x;--j) update(v[j].y,v[j].z,ans);
        }
    }
    printf("%d\n",maxans);
}
void clear_aib()
{
    for(int i=1;i<=n;i++)
    {
        for(int j=v[i].y;j<=n;j+=(j&(-j)))
        {
            for(int k=v[i].z;k<=n;k+=(k&(-k))) aib[j][k]=0;
        }
    }
}
int main()
{
    freopen ("cutii.in","r",stdin);
    freopen ("cutii.out","w",stdout);
    int t;
    scanf("%d%d",&n,&t);
    for(;t>0;--t)
    {
        citire();
        solve();
        clear_aib();
    }
}