Cod sursa(job #445351)

Utilizator vladiiIonescu Vlad vladii Data 23 aprilie 2010 16:35:13
Problema Marbles Scor 100
Compilator cpp Status done
Runda Arhiva de probleme Marime 2.74 kb
#include <iostream>
#include <vector>
using namespace std;
#define MOD 11057

int N, M, cmax;
vector<pair<int, int> > Hash[MOD + 1];
vector<int> bile[64];

int cautamin(int color, int val) {
    int sol = -1;
    int ls = 0, ld = bile[color].size() - 1;
    
    while(ls <= ld) {
         int mij = (ls + ld) >> 1;
         if(bile[color][mij] < val) {
              ls = mij + 1;
         }
         else {
              sol = mij;
              ld = mij - 1;
         }
    }
    
    return sol;
}
               
int cautamax(int color, int val) {
    int sol = -1;
    int ls = 0, ld = bile[color].size() - 1;
    
    while(ls <= ld) {
         int mij = (ls + ld) >> 1;
         if(bile[color][mij] <= val) {
              sol = mij;
              ls = mij + 1;
         }
         else {
              ld = mij - 1;
         }
    }
    
    return sol;
}
               
int main() {
    FILE *f1=fopen("marbles.in", "r"), *f2=fopen("marbles.out", "w");
    int i, j, t, p, q, c, x ,y;
    fscanf(f1, "%d %d\n", &N, &M);
    for(i=1; i<=N; i++) {
         fscanf(f1, "%d %d\n", &p, &q);
         cmax = max(q, cmax);
         bile[q].push_back(p);
         //la coordonata p se afla o bila de culoare q [in hash]
         j = p % MOD;
         c = p / MOD;
         if(j < 0) j+=MOD;
         Hash[j].push_back(make_pair(c, q));
    }
    for(i=1; i<=cmax; i++) {
         sort(bile[i].begin(), bile[i].end());
    }
    for(j=1; j<=M; j++) {
         fscanf(f1, "%d %d %d\n", &t, &p, &q);
         if(t == 1) {
              //query
              int sol = 0;
              for(c=1; c<=cmax; c++) {
                   x = cautamin(c, p);
                   y = cautamax(c, q);
                   if(x > -1 && y > -1) sol = max(sol, y - x + 1);
              }
              fprintf(f2, "%d\n", sol);
         }
         else if(t == 0) {
              //update
              //mut de la pozitia p la pozitia p + q
              x = p % MOD;
              y = p / MOD;
              if(x < 0) x+=MOD;
              int col;
              for(vector<pair<int, int> >::iterator it=Hash[x].begin(); it!=Hash[x].end(); it++) {
                   if((*it).first == y) {
                        col = (*it).second;
                        Hash[x].erase(it);
                        break;
                   }
              }
              x = (p + q) % MOD;
              y = (p + q) / MOD;
              if(x < 0) x+=MOD;
              Hash[x].push_back(make_pair(y, col));
              //modific si in bile[col]
              x = lower_bound(bile[col].begin(), bile[col].end(), p) - bile[col].begin();
              bile[col][x] = p + q;
         }
    }
    fclose(f1); fclose(f2);
    return 0;
}