Cod sursa(job #1231343)

Utilizator Adrian1997Radulescu Adrian Adrian1997 Data 20 septembrie 2014 12:41:10
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.14 kb
#include <fstream>
#include <cstring>
#include <algorithm>
using namespace std;
ifstream f("cutii.in");
ofstream g("cutii.out");
int n,T;
int A[3511][3511];

struct cutie{
    int x,y,z;
} v[3511];

int cmp(cutie a,cutie b){
    return (a.z<b.z);
}

void update(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]=max(A[i][j],val);
}

int query(int x,int y){
    int rez=0;
    for(int i=x;i>0;i-=(i&(-i)))
        for(int j=y;j>0;j-=(j&(-j)))
            rez=max(rez,A[i][j]);
    return rez;
}

int main(void){
    register int i,j,val,m,k;

    f>>n>>T;
    for(;T;T--){
        for(i=1;i<=n;i++)
            f>>v[i].x>>v[i].y>>v[i].z;
        sort(v+1,v+n+1,cmp);
        m=0;
        for(i=1;i<=n;i++){
            val=1+query(v[i].x-1,v[i].y-1);
            m=max(m,val);
            update(v[i].x,v[i].y,val);
        }
        g<<m<<"\n";
        for(k=1;k<=n;k++)
            for(i=v[k].x;i<=n;i+=(i&(-i)))
                for(j=v[k].y;j<=n;j+=(j&(-j)))
                    A[i][j]=0;
    }

    f.close();
    g.close();
    return 0;
}