Pagini recente » Cod sursa (job #854686) | Istoria paginii runda/concurs_000003/clasament | Cod sursa (job #1700066) | Cod sursa (job #2548157) | Cod sursa (job #1390494)
#include <algorithm>
#include <fstream>
using namespace std;
ifstream fin("marbles.in");
ofstream fout("marbles.out");
const int nmax= 100000;
const int cmax= 64;
int s[nmax+1][cmax+1], p[nmax+1];
struct str {
int x, y;
} v[nmax+1];
bool cmp( str x, str y ) {
return x.x<y.x;
}
int main( ) {
int n, q;
fin>>n>>q;
for ( int i= 1; i<=n; ++i ) {
fin>>v[i].x>>v[i].y;
}
sort( v+1, v+n+1, cmp ) ;
for ( int i= 1; i<=n; ++i ) {
p[i]= v[i].x;
for ( int j= 1; j<=cmax; ++j ) {
s[i][j]= s[i-1][j];
}
++s[i][v[i].y];
}
int n2;
for ( n2= 1; 2*n2<=n; n2*=2 ) ;
for ( int cnt= 1; cnt<=q; ++cnt ) {
int x, y, z;
fin>>x>>y>>z;
if ( x==0 ) {
int sol= 0;
for ( int step= n2; step>0; step/= 2 ) {
if ( sol+step<=n && p[sol+step]<=y ) {
sol+= step;
}
}
p[sol]+= z;
} else {
int a= n, b= 0;
for ( int step= n2; step>0; step/= 2 ) {
if ( a-step>=1 && p[a-step]>=y ) {
a-= step;
}
if ( b+step<=n && p[b+step]<=z ) {
b+= step;
}
}
int maxim= 0;
for ( int i= 1; i<=cmax; ++i ) {
maxim= max(maxim, s[b][i]-s[a-1][i]);
}
if ( p[a]<y || p[b]>z ) maxim= 0;
fout<<maxim<<"\n";
}
}
return 0;
}