Cod sursa(job #2536020)

Utilizator verde.cristian2005Verde Flaviu-Cristian verde.cristian2005 Data 1 februarie 2020 13:48:53
Problema Marbles Scor 80
Compilator cpp-64 Status done
Runda Arhiva de probleme Marime 2.59 kb
#include <iostream>
#include <cstdio>
#include <algorithm>
using namespace std;
const int N=100000;
int aib[65][3*N+1],cul[3*N+1],cnt;
int vec[3*N+1];
const int val=1<<17;
char next_char()
{
    static char buff[val];
    static int bp=val;
    if(bp==val)
    {
        bp=0;
        fread(buff,1,val,stdin);
    }
    return buff[bp++];
}
void get(int &a)
{
    a=0;
    int semn=1;
    char ch;
    do
    {
        ch=next_char();
        if(ch=='-')
            semn=-1;
    }
    while('0'>ch||ch>'9');
    do
    {
        a=a*10+(ch-'0');
        ch=next_char();
    }
    while('0'<=ch&&ch<='9');
    a*=semn;
}
struct mazan
{
    int t,a,b;
} v[N+1],vv[N+1];
int lsb(int x)
{
    return x&-x;
}
void update(int care,int poz,int val)
{
    for(; poz<=cnt; poz+=lsb(poz))
        aib[care][poz]+=val;
}
int ask(int care,int poz)
{
    int sum=0;
    for(; poz>0; poz-=lsb(poz))
        sum+=aib[care][poz];
    return sum;
}
int val1(int poz)
{
    int r=0,pas=1<<18;
    while(pas)
    {
        if(r+pas<=cnt&&vec[r+pas]<=poz)
            r+=pas;
        pas/=2;
    }
    return r;
}
int main()
{
    freopen("marbles.in","r",stdin);
    freopen("marbles.out","w",stdout);
    int n,m,max1=0,i,j,x;
    get(n);
    get(m);
    for(i=1; i<=n; i++)
    {
        get(vv[i].a);
        get(vv[i].b);
        vec[++cnt]=vv[i].a;
        vec[++cnt]=vv[i].b;
    }
    for(i=1; i<=m; i++)
    {
        get(v[i].t);
        get(v[i].a);
        get(v[i].b);
        vec[++cnt]=v[i].a;
        vec[++cnt]=v[i].b;
        if(v[i].t==0)
            vec[cnt]=v[i].a+v[i].b;
    }
    sort(vec+1,vec+cnt+1);
    int cnt1=0;
    for(i=1; i<=cnt; i++)
        if(vec[i]!=vec[i-1])
            vec[++cnt1]=vec[i];
    cnt=cnt1;
    int maxx=0;
    for(i=1; i<=n; i++)
    {
        vv[i].a=val1(vv[i].a);
        vv[i].b=val1(vv[i].b);
        maxx=max(maxx,vv[i].b);
        cul[vv[i].a]=vv[i].b;
        update(vv[i].b,vv[i].a,1);
    }
    for(i=1; i<=m; i++)
    {
        if(v[i].t==0)
        {
            x=v[i].a;
            v[i].a=val1(v[i].a);
            v[i].b=val1(x+v[i].b);
            cul[v[i].b]=cul[v[i].a];
            cul[v[i].a]=0;
            update(cul[v[i].b],v[i].b,1);
            update(cul[v[i].b],v[i].a,-1);
        }
        else
        {
            v[i].a=val1(v[i].a);
            v[i].b=val1(v[i].b);
            max1=0;
            for(j=1; j<=maxx; j++)
                max1=max(max1,ask(j,v[i].b)-ask(j,v[i].a-1));
            cout<<max1<<'\n';
        }
    }
    return 0;
}