Cod sursa(job #2046296)

Utilizator Ruxandra985Nanu Ruxandra Laura Ruxandra985 Data 23 octombrie 2017 17:50:12
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.32 kb
#include <cstdio>
#include <algorithm>
#define z first
#define x second.first
#define y second.second

using namespace std;
pair <int,pair <int,int> > v[3501];
int a[3501][3501],n;
void refac (int i,int j,int p){
    int xx,yy;
    for (xx=i;xx<=n;xx+=(xx&-xx)){
        for (yy=j;yy<=n;yy+=(yy&-yy))
            a[xx][yy]=p;
    }
}
void update (int i,int j,int p){
    int xx,yy;
    for (xx=i;xx<=n;xx+=(xx&-xx)){
        for (yy=j;yy<=n;yy+=(yy&-yy))
            a[xx][yy]=max(a[xx][yy],p);
    }
}
int query (int i,int j){
    int xx,yy,sol=0;
    for (xx=i;xx;xx-=(xx&-xx))
        for (yy=j;yy;yy-=(yy&-yy))
            sol=max(a[xx][yy],sol);
    return sol;
}
int main()
{
    FILE *fin=fopen ("cutii.in","r");
    FILE *fout=fopen ("cutii.out","w");
    int t,i,sol,mc;
    fscanf (fin,"%d%d",&n,&t);
    for (;t;t--){
        for (i=1;i<=n;i++)
            fscanf (fin,"%d%d%d",&v[i].x,&v[i].y,&v[i].z);
        sort (v+1,v+n+1);
        // d[i][j] lvl maxim de imbricare al unor cutii cu c.x<=i && c.y<=j
        sol=0;
        for (i=1;i<=n;i++){
            mc=query (v[i].x,v[i].y)+1;
            update (v[i].x,v[i].y,mc);
            sol=max(sol,mc);
        }
        fprintf (fout,"%d\n",sol);
        for (i=1;i<=n;i++)
            refac (v[i].x,v[i].y,0);
    }
    return 0;
}