Cod sursa(job #1390493)

Utilizator Athena99Anghel Anca Athena99 Data 17 martie 2015 08:22:13
Problema Marbles Scor 0
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.39 kb
#include <fstream>

using namespace std;

ifstream fin("marbles.in");
ofstream fout("marbles.out");

const int nmax= 100000;
const int cmax= 64;

int s[nmax+1][cmax+1], p[nmax+1];

int main(  ) {
    int n, q;
    fin>>n>>q;
    for ( int i= 1; i<=n; ++i ) {
        int a, b;
        fin>>a>>b;
        p[i]= a;

        for ( int j= 1; j<=cmax; ++j ) {
            s[i][j]= s[i-1][j];
        }
        ++s[i][b];
    }

    int n2;
    for ( n2= 1; 2*n2<=n; n2*=2 ) ;

    for ( int cnt= 1; cnt<=q; ++cnt ) {
        int x, y, z;
        fin>>x>>y>>z;

        if ( x==0 ) {
            int sol= 0;
            for ( int step= n2; step>0; step/= 2 ) {
                if ( sol+step<=n && p[sol+step]<=y ) {
                    sol+= step;
                }
            }

            p[sol]+= z;
        } else {
            int a= n, b= 0;
            for ( int step= n2; step>0; step/= 2 ) {
                if ( a-step>=1 && p[a-step]>=y ) {
                    a-= step;
                }
                if ( b+step<=n && p[b+step]<=z ) {
                    b+= step;
                }
            }

            int maxim= 0;
            for ( int i= 1; i<=cmax; ++i ) {
                maxim= max(maxim, s[b][i]-s[a-1][i]);
            }

            if ( p[a]<y || p[b]>z ) maxim= 0;
            fout<<maxim<<"\n";
        }
    }

    return 0;
}