Cod sursa(job #1471271)

Utilizator AlexNiuclaeNiculae Alexandru Vlad AlexNiuclae Data 13 august 2015 15:50:22
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.45 kb
#include <cstdio>
#include <algorithm>

#define F first
#define S second

#define last_bit(x) (x&(-x))

using namespace std;

const int Nmax = 100010;

int n , m , i;
int dp[64][Nmax];
pair < int , int > info[Nmax];

int search_(int val)
{
    int i , step;

    for (step = 1; step < n; step <<= 1);

    for (i = 0; step; step >>= 1)
        if (i + step <= n && info[i+step].F < val)
            i += step;

    return i;
}

int main()
{
    freopen("marbles.in","r",stdin);
    freopen("marbles.out","w",stdout);

    scanf("%d %d", &n, &m);

    for (i = 1; i <= n; ++i)
        scanf("%d %d", &info[i].F, &info[i].S),
        info[i].S--;

    sort(info + 1 , info + n + 1);

    for (int cul = 0; cul < 64; ++cul)
        for (i = 1; i <= n; ++i)
            dp[cul][i] = dp[cul][i-1] + (info[i].S == cul);

    for ( ; m ; --m)
    {
        int tip , left , right;
        scanf("%d %d %d", &tip, &left, &right);

        if (tip == 0)
        {
            info[search_(left)+1].F += right;
        }
        else
        {
            int c = right;
            left = search_(left);
            right = search_(right) + 1;

            if (right > n || info[right].F > c)
                right--;

            int ans = 0;
            for (int cul = 0; cul < 64; ++cul)
                ans = max(ans , dp[cul][right] - dp[cul][left]);
            printf("%d\n", ans);
        }
    }

    return 0;
}