Pagini recente » Cod sursa (job #429539) | Cod sursa (job #1017930) | Cod sursa (job #268495) | Cod sursa (job #271326) | Cod sursa (job #204370)
Cod sursa(job #204370)
using namespace std;
#include <cstdio>
#include <algorithm>
#include <vector>
#include <utility>
#define IN "marbles.in"
#define OUT "marbles.out"
#define FOR(i,a,b) for(int i=a;i<=b;++i)
#define N_MAX 1<<17
#define CC 1<<6
#define f first
#define s second
int k(-1),N,M;
vector< pair<int,int> > V(N_MAX);
char buffer[1<<22];
int MX[(CC)+1],S[(CC)+1][N_MAX],X[N_MAX];
int CCM,CCm(65),CONST_STEP;
void scan()
{
freopen(IN, "r",stdin);
freopen(OUT, "w",stdout);
scanf("%d%d\n", &N,&M);
fread(buffer,1,1<<22,stdin);
V.resize(N);
FOR(i,1,N)
{
for(;buffer[++k] != ' ';)
V[i].f = V[i].f * 10 + buffer[k] - '0';
for(;buffer[++k] != '\n';)
V[i].s = V[i].s * 10 + buffer[k] - '0';
CCm = min(CCm,V[i].s);
CCM = max(CCM,V[i].s);
}
sort(V.begin(), V.end());
}
inline int find(int val)
{
int m,step = CONST_STEP;
for(m = 1; step; step >>= 1)
if( m + step <= N && X[m + step - 1] < val )
m += step;
return m;
}
void solve()
{
bool semn,type;
int x,y;
int pozx,pozy;
for(CONST_STEP = 1; CONST_STEP <= N; CONST_STEP <<= 1);
FOR(i,1,N)
FOR(ci,CCm,CCM)
S[ci][i] = (V[i].s == ci ? S[ci][i-1] + 1 : S[ci][i-1]);
FOR(i,1,N)
X[i] = V[i].f;
vector< pair<int,int> > ().swap(V);
FOR(i,1,M)
{
x = y = semn = 0;
for(;buffer[++k] != ' ';)
type = buffer[k] - '0';
for(;buffer[++k] != ' ';)
x = x * 10 + buffer[k] - '0';
for(;buffer[++k] != '\n' && buffer[k] != '\0';)
{
if(buffer[k] == '-')
++k,semn = 1;
y = y * 10 + buffer[k] - '0';
}
if(semn)
y *= -1;
if(type)
{
int best(0);
pozx = find(x);
if(X[pozx] < x)
++pozx;
pozy = find(y);
if(X[pozy] > y)
--pozy;
--pozx;
FOR(ci,CCm,CCM)
if(S[ci][pozy] - S[ci][pozx] > best)
best = S[ci][pozy] - S[ci][pozx];
printf("%d\n", best);
}
else
{
pozx = find(x);
X[pozx] = x+y;
}
}
}
int main()
{
scan();
solve();
return 0;
}