Pagini recente » Cod sursa (job #1212286) | Cod sursa (job #2549454) | Cod sursa (job #700688) | Cod sursa (job #587125) | Cod sursa (job #445351)
Cod sursa(job #445351)
#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;
}