Cod sursa(job #2012916)

Utilizator pepsiM4A1Ozturk Arif pepsiM4A1 Data 19 august 2017 20:33:13
Problema Cutii Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.84 kb
#include <cstdio>
#include <algorithm>
using namespace std;
const int nmax=3502,DIM=50000;
int n;
int aib[nmax][nmax];
char buff[DIM];
int poz=DIM-1;
void citeste(int &nr)
{
    nr=0;
    while(!('0'<=buff[poz]&&buff[poz]<='9'))
    {
        if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;
    }
    while('0'<=buff[poz]&&buff[poz]<='9')
    {
        nr=nr*10 + buff[poz]-'0';
        if(++poz==DIM) fread(buff,1,DIM,stdin),poz=0;
    }
}
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++) citeste(v[i].x),citeste(v[i].y),citeste(v[i].z);
    sort(v+1,v+n+1);
}
void update(int p1,int p2,int val)
{
    for(int i=p1;i<=n;i+=(i&(-i)))
    {
        for(int j=p2;j<=n;j+=(j&(-j))) 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;
    citeste(n),citeste(t);
    for(;t>0;--t)
    {
        citire();
        solve();
        clear_aib();
    }
}