Cod sursa(job #1866936)

Utilizator hrazvanHarsan Razvan hrazvan Data 3 februarie 2017 16:59:54
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 1.43 kb
#include <cstdio>
#include <algorithm>
#define MAXN 100001
#define MAXC 65
int v[MAXN], ml[MAXN], mc[MAXN];
int nr[MAXC][MAXN];
int n, lg;

bool cmp(int a, int b){
  if(ml[a] < ml[b])
    return 1;
  return 0;
}

inline void precalc(){
  int i, j;
  for(j = 1; j <= MAXC; j++){
    for(i = 1; i <= n; i++){
      nr[j][i] = nr[j][i - 1];
      if(mc[v[i]] == j)
        nr[j][i]++;
    }
  }
}

inline int caut(int x){
  int i = 0, pas;
  for(pas = (1 << lg); pas > 0; pas /= 2){
    if(i + pas < n && ml[v[i + pas]] < x)
      i += pas;
  }
  return i;
}

int main(){
  FILE *in = fopen("marbles.in", "r");
  int m, t, x, y, ps, pd, rez, rc, i, j, aux;
  fscanf(in, "%d%d", &n, &m);
  lg = 0;
  while((1 << lg) <= n)
    lg++;
  lg--;
  for(i = 1; i <= n; i++){
    fscanf(in, "%d%d", &ml[i], &mc[i]);
    v[i] = i;
  }
  std::sort(v + 1, v + n + 1, cmp);
  precalc();
  FILE *out = fopen("marbles.out", "w");
  for(i = 1; i <= m; i++){
    fscanf(in, "%d%d%d", &t, &x, &y);
    if(t == 0){
      ps = caut(x + 1);
      ml[v[ps]] += y;
    }
    else{
      if(x > y){
        aux = x;  x = y;  y = aux;
      }
      ps = caut(x);
      pd = caut(y + 1);
      rez = 0;
      for(j = 1; j <= MAXC; j++){
        rc = nr[j][pd];
        rc -= nr[j][ps];
        if(rc > rez)
          rez = rc;
      }
      fprintf(out, "%d\n", rez);
    }
  }
  fclose(in);
  fclose(out);
  return 0;
}